为什么要输入一个void指针?

作为C的新手,我从void指针中获得的唯一实际用法是用于在给定指针中存储不同数据类型的多function函数。 因此,在进行内存分配时,我没有输入指针。

我见过一些有时使用void指针的代码示例,但是它们是类型转换的。 为什么这有用? 为什么不直接创建所需类型的指针而不是void?

在C中将void指针转换为另一个类型有两个原因。

  1. 如果要访问指针指向的内容( *(int*)p = 42
  2. 如果你实际上是在C和C ++的公共子集中编写代码,而不是“真正的”C.参见我是否转换了malloc的结果?

1的原因应该是显而易见的。 第二个是因为C ++不允许从void*到其他类型的隐式转换,而C允许它。

如果要取消引用它们,则需要将void指针转换为其他内容,例如,您将void指针作为函数参数获得,并且您确定这是一个整数:

 void some_function(void * some_param) { int some_value = *some_param; /* won't work, you can't dereference a void pointer */ } void some_function(void * some_param) { int some_value = *((int *) some_param); /* ok */ } 

您的void指针可能代表一些更复杂的类型,例如为了访问成员而需要取消引用的结构。

 typedef struct CombinedData { int memberA; double memberB; } CombinedData; void fun(void* data) { CombinedData* p = (CombinedData*)data; doSomethingWith(p->memberA, p->memberB); }