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

Ann*_*Ann 19 c malloc types casting

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

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

wol*_*ang 18

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

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

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

  • @ H2Co3:是的,但有时您在宏或内联函数的头文件中定义了代码,这些代码可用于包含这些头的C和C++代码. (6认同)
  • 但是参数2是无效的:不应该用C++编译器编译C代码. (2认同)
  • @ H2CO3然而,有些人这样做.我试图解释这种现象,而不是证明这一点. (2认同)

Gui*_*ume 9

如果要取消引用它们,则需要将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 */
}
Run Code Online (Sandbox Code Playgroud)

  • 你不需要;*更可读(我更喜欢)的方法是`int*tmp = param; int val =*tmp;`. (2认同)
  • @Armin您不需要**,我重复一遍-如果将指针分配给临时对象,可以避免强制转换。 (2认同)