Mar*_*ark 4 c types pointers casting void-pointers
考虑以下片段:
void my_func(int a, void *b);
...
struct my_struct s = { };
my_func(10, (void *)&s);
Run Code Online (Sandbox Code Playgroud)
(void *)
传递&s
给函数时是否需要类型转换?
指向任何类型的指针都可以自由转换为 a 或从 a 转换,void *
而无需进行强制转换。
C 标准的第 6.3.2.3p1 节规定:
指向 void 的指针可以与指向任何对象类型的指针相互转换。指向任何对象类型的指针都可以转换为指向 void 的指针,然后再返回;结果应与原始指针相等。
唯一需要强制printf
转换的情况是,如果您将指针传递给可变参数函数,例如不能发生隐式转换的地方,因为它不知道传入的确切类型是什么。
请注意,与任何指针类型一样,您不能“删除”限定符,例如const
在传递给没有强制转换的函数时。第 6.3.2.3p2 节规定:
对于任何限定符q,指向非q限定类型的指针可以转换为指向该类型的q限定版本的指针;存储在原始指针和转换后的指针中的值比较相等。