这可能很明显,但是 void 指针可以安全地指向另一个指针吗?即指向一个类型 int *
int i = 5;
int *ip = &i;
void *vp = &ip;
int *nip = *(int **)vp;
int ni = *nip; // == 5?
编辑:对不起,也许我不清楚,我想知道一个 void 指针是否可以指向具有另一个指针类型的内存部分;没有无效的**。只是无效*
是的,您可以将任何对象指针转换void *
回原始指针类型,而不会丢失信息。
从马口中:
(C99,6.3.2.3p1)“指向 void 的指针可以转换为指向任何不完整或对象类型的指针或从指向任何不完整或对象类型的指针转换。指向任何不完整或对象类型的指针可以转换为指向 void 的指针并再次返回;结果应该比较等于原始指针。”
是的,它可以指向任何对象类型1。您实际上不能取消引用void 指针,因为编译器不知道它背后的“真实”类型。但是指向方面很好。
来自C11 6.3.2.3 Pointers /1
:
指向 void 的指针可以转换为指向任何对象类型的指针或从指向任何对象类型的指针转换。指向任何对象类型的指针都可以转换为指向 void 的指针并再次返回;结果应与原始指针比较。
1/ “对象类型”不包括函数,转换函数指针的规则稍有限制。