void指针可以安全地指向另一个指针吗?

时间:2013-10-12 01:20:21

标签: c pointers void

这可能很明显但是,void指针可以安全地指向另一个指针吗?即指向int *

类型
int i = 5;
int *ip = &i;
void *vp = &ip;

int *nip = *(int **)vp;
int ni = *nip; // == 5?

编辑:对不起,也许我不清楚,我想知道一个空指针是否可以指向一个具有另一个指针类型的内存部分;没有空虚**。只是无效*

2 个答案:

答案 0 :(得分:6)

是的,您可以将任何对象指针转换为void *并返回原始指针类型而不会丢失信息。

从马的嘴里说:

  

(C99,6.3.2.3p1)“指向void的指针可以转换为指向任何不完整或对象类型的指针。指向任何不完整或对象类型的指针可以转换为指向void的指针,然后再返回;结果将与原始指针进行比较。“

答案 1 :(得分:2)

是的,它可以指向任何对象类型 1 。你实际上不能取消引用一个void指针,因为编译器不知道它背后的“真实”类型。但指点方面还不错。

来自C11 6.3.2.3 Pointers /1

  

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


1 / “对象类型”不包含函数,转换函数指针的规则略有限制。