是否所有指针都保证正确地往返*?

SOD*_*IMM 1 c pointers void-pointers language-lawyer

在C中,是否可以保证任何指针类型都能void *成功往返?

也就是说,类似以下内容保证可以工作:

typedef struct {
...
} A;

A *p = ...;
void *v = p;
A *p2 = v;
// use p2 here
Run Code Online (Sandbox Code Playgroud)

不管是什么类型的A

Ker*_* SB 5

对象指针确实可以进行往返void*.从C11 6.3.2.3第1段:

指向void的指针可以转换为指向任何对象类型的指针.指向任何对象类型的指针可以转换为指向void的指针,然后再返回; 结果应该等于原始指针.

请注意,相反的方向不正确,当您将void指针转换为某个对象指针并返回时,您不能保证与您开始时的值相同.

还要注意,函数指针不是这样; 但是,所有函数指针类型都是相互可循环的:第8段说:

指向一种类型的函数的指针可以被转换为指向另一种类型的函数的指针并且再次返回; 结果应该等于原始指针.

此外,对象指针在它们之间也是可以绕过的(不涉及void指针),受到一些限制,第7段:

指向对象类型的指针可以转换为指向不同对象类型的指针.如果引用类型的结果指针未正确对齐),则行为未定义.否则,当再次转换回来时,结果将等于原始指针.