将指针传递给对象时类型转换为 (void *)

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给函数时是否需要类型转换?

dbu*_*ush 5

指向任何类型的指针都可以自由转换为 a 或从 a 转换,void *而无需进行强制转换。

C 标准的第 6.3.2.3p1 节规定:

指向 void 的指针可以与指向任何对象类型的指针相互转换。指向任何对象类型的指针都可以转换为指向 void 的指针,然后再返回;结果应与原始指针相等。

唯一需要强制printf转换的情况是,如果您将指针传递给可变参数函数,例如不能发生隐式转换的地方,因为它不知道传入的确切类型是什么。

请注意,与任何指针类型一样,您不能“删除”限定符,例如const在传递给没有强制转换的函数时。第 6.3.2.3p2 节规定:

对于任何限定符q,指向非q限定类型的指针可以转换为指向该类型的q限定版本的指针;存储在原始指针和转换后的指针中的值比较相等。