void *和void **的心理模型?

时间:2011-04-08 07:41:04

标签: c++ c void-pointers

注意:我是一位经验丰富的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
}

5 个答案:

答案 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 *指向实际对象。