作为一个C语言新手,我对于void指针仅有的实用性是它可以在给定的指针中存储不同的数据类型,因此在进行内存分配时我没有将指针进行强制类型转换。
我看到一些代码示例有时会使用void指针,但它们会被强制类型转换。这有什么用处呢?为什么不直接创建所需类型的指针而非void指针呢?
*(int*)p = 42
)a->b = malloc(sizeof(*a->b))
没有提供任何信息,而 a->b = (struct Monster*)malloc(sizeof(*a->b))
则提供了明确的信息。 - xryl669如果你想引用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 */
}
int *tmp = param; int val = *tmp;
。 - user529758
void*
强制转换,因为语言已经定义了从void*
自动转换到任何其他指针类型的规则,但并不是所有程序员都知道这一点(甚至包括遗憾的是并非所有的 C 书籍作者)。 - Fred Foovoid *
和所有数据指针类型之间的隐式兼容性。函数指针不在游戏中(但是,如果您的系统是POSIX,并且为什么会有任何理智的程序员使用任何非POSIX系统,则函数指针也与void *
兼容)。 - user529758