【问题标题】:can a void pointer safely point to annother pointer?空指针可以安全地指向另一个指针吗?
【发布时间】:2013-10-12 01:20:21
【问题描述】:

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

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

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

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

【问题讨论】:

  • int *nip = *vp; 应该是int *nip = vp;
  • 不,这将是一个非常明显的问题,不过感谢您的贡献。
  • int *nip = *vp; 在这种情况下答案很明显:您不能取消引用 void *。期间。
  • 啊是的,你说的很对,我应该投的
  • 现在在上面编辑,谢谢

标签: c pointers void


【解决方案1】:

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

从马口中:

(C99, 6.3.2.3p1) “指向 void 的指针可以转换为指向任何不完整或对象类型的指针或从指向任何不完整或对象类型的指针转​​换。指向任何不完整或对象类型的指针可以转换为指向 void 的指针并再次返回; 结果应与原始指针相等。"

【讨论】:

  • 它可以指向任何东西;指针没有什么特别之处。
  • @jayjay void * 可以指向任何对象:所以intint * 甚至int **
  • 他的意思是说,它可以指向任何东西,甚至是 int** 或 int* 或 char***。任何东西。
【解决方案2】:

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

来自C11 6.3.2.3 Pointers /1

指向 void 的指针可以转换为或从指向 any 对象类型的指针转​​换。指向 any 对象类型的指针可以转换为指向 void 的指针并再次返回;结果应与原始指针比较。


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

【讨论】:

  • 是的,它可以指向任何类型 它可以指向任何对象类型。不能保证保存函数指针类型。
  • 关于投射const 类型的编辑已回滚。如果您没有注意到,这是一个 C 问题,而不是 C++ 问题。
猜你喜欢
  • 2016-08-11
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2011-02-01
相关资源
最近更新 更多