虚空*和虚空**的心理模型? 注:我是一个有经验的C++程序员,所以我不需要任何指针基础。只是我从来没有与void**一起工作过,我的心智模型很难适应void*与void**的对比。我希望有人能很好地解释这一点,这样我就能更容易地记住语义
考虑以下代码:(使用VC++2005编译)虚空*和虚空**的心理模型? 注:我是一个有经验的C++程序员,所以我不需要任何指针基础。只是我从来没有与void**一起工作过,我的心智模型很难适应void*与void**的对比。我希望有人能很好地解释这一点,这样我就能更容易地记住语义,c++,c,void-pointers,C++,C,Void Pointers,考虑以下代码:(使用VC++2005编译) void具有误导性,因为它听起来像null。但是,最好将void视为未指定的类型。因此,void*是未指定类型的指针,void**是未指定类型指针的指针。avoid*指向编译器未知类型的对象 void**指向存储此类void*void*的变量是指向某个对象的指针,但您不知道是什么。因为你不知道它是什么,你不知道它占用了多少空间,所以你不能增加指针 void**是指向void*的指针,因此它是指向指针的指针。我们知道指针占用了多少空间,所以我们可以增加v
void
具有误导性,因为它听起来像null
。但是,最好将void
视为未指定的类型。因此,void*
是未指定类型的指针,void**
是未指定类型指针的指针。avoid*
指向编译器未知类型的对象
void**
指向存储此类void*
void*
的变量是指向某个对象的指针,但您不知道是什么。因为你不知道它是什么,你不知道它占用了多少空间,所以你不能增加指针
void**
是指向void*
的指针,因此它是指向指针的指针。我们知道指针占用了多少空间,所以我们可以增加void**
指针以指向下一个指针。Avoid*
可以指向任何东西(函数除外)。所以它甚至可以指向指针,甚至可以指向其他void*
对象
void**
是指向-void*
的指针,因此它只能用于指向void*
对象。void
是一种没有对象的类型
void*
是一种传统的标量类型
void**
也是一种传统的标量类型,恰好指向void*
void*
可以用来指向任何东西,但我更喜欢只将其用于未初始化的存储。通常有一种更好的方法来代替将void*
指向实际对象。在C语言中,void*
通常是实现“泛型”函数的唯一实用方法。@Oli:是的,我想我不确定这里的语言上下文。这是一种奇怪的思维模式,“但是,最好将void看作一种未指定的类型。”在void*
的上下文中有很好的解释,但是应该明确限定该上下文,因为这对于返回类型、参数列表等来说是完全错误的。void*是指向某个对象的指针,您通常确切知道该对象是什么(例如,由void*引用的int的链接列表),或者您不在乎(例如,memcpy从void*复制到void*)。这可能是迄今为止最好的解释之一。啊……简直太神奇了:)你的代码在GCC4.5.2中编译得很好,甚至是另一个地址+1代码>零件。你能添加你收到的错误信息吗?@Philip:我最近无意中发现一个帖子,说有一个GCC扩展,可以在void*上做算术运算。这就是GCC没有出现错误的原因。错误消息已在注释中:“void*”未知,请澄清。老兄,我讨厌那些GNU的人。。。
int main() {
int obj = 42;
void* ptr_to_obj = &obj;
void* addr_of_ptr_to_obj = &ptr_to_obj;
void** ptr_to_ptr_to_obj = &ptr_to_obj;
void* another_addr = ptr_to_ptr_to_obj[0];
// another_addr+1; // not allowed : 'void*' unknown size
ptr_to_ptr_to_obj+1; // allowed
}