19

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

5 回答 5

33

void*是指向某物的指针,但你不知道是什么。因为你不知道它是什么,你不知道它占用了多少空间,所以你不能增加指针。

void**是指向 的指针void*,所以它是指向指针的指针。我们知道空间指针占用了多少空间,因此我们可以递增void**指针以指向下一个指针。

于 2011-04-08T07:45:26.403 回答
7

Avoid*指向编译器不知道其类型的对象。

Avoid**指向一个存储这样的变量void*

于 2011-04-08T07:45:15.670 回答
4

Avoid *可以指向任何东西(函数除外)。所以它甚至可以指向指针,所以它甚至可以指向其他void *对象。

Avoid **是指向- 的指针void *,因此它只能用于指向void *对象。

于 2011-04-08T07:45:49.147 回答
1

void具有误导性,因为它听起来像null。但是,最好将其void视为未指定的类型。所以 avoid*是未指定类型void**的指针,a 是指向未指定类型的指针的指针。

于 2011-04-08T07:44:50.683 回答
1

void是一种没有对象的类型。

void *是传统的标量类型。

void **也是一个传统的标量类型,恰好指向void *.


void *可以用来指向任何东西,但我更喜欢只将它用于未初始化的存储。void *将 a 指向实际对象通常有更好的选择。

于 2011-04-08T07:46:04.293 回答