注意:我是一位经验丰富的C ++程序员,所以我不需要任何指针基础知识。只是因为我从未与void**
合作过,并且很难将我的心理模型调整为void*
与void**
。我希望有人能够以一种好的方式解释这一点,这样我就能更容易地记住语义。
考虑以下代码:(使用例如VC ++ 2005编译)
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
}
答案 0 :(得分:33)
void*
是指向某事物的指针,但你不知道是什么。因为你不知道它是什么,你不知道它占用多少空间,所以你不能增加指针。
void**
是指向void*
的指针,因此它是指向指针的指针。我们知道空间指针占用多少空间,因此我们可以将void**
指针递增以指向下一个指针。
答案 1 :(得分:7)
void*
指向编译器未知类型的对象。
void**
指向存储此类void*
的变量。
答案 2 :(得分:4)
void *
可以指向任何(功能除外)。所以它甚至可以指向指针,因此它甚至可以指向其他void *
个对象。
void **
是指向void *
的指针,因此只能 指向void *
个对象。
答案 3 :(得分:1)
void
具有误导性,因为它听起来像null
。但是,最好将void
视为未指定的类型。因此void*
是指定未指定类型的指针,void**
是指向未指定类型的指针的指针。
答案 4 :(得分:1)
void
是一种没有对象的类型。
void *
是传统的标量类型。
void **
也是传统的标量类型,恰好指向void *
。
void *
可用于指向任何内容,但我更喜欢将其用于未初始化的存储。通常有一种更好的替代方法可以将void *
指向实际对象。