void *和void **之间有什么区别?

这是一个特殊的属性,void *也可以被指定一个指向指针的指针并返回并接收原始值。

我在某处读过这行。 这意味着void*void**是一样的吗? 有什么不同?

编辑

void*可以保存任何指针。 然后需要什么呢?

一个人指着一个黑洞。

另一点指向黑洞。


它们不是真的相同,但指针可以转换为void * 。 你可以将int *转换为void *因为它是一个指针。 void ** 仍然是一个指针(它只指向一个指针),因为它是一个指针,你可以将它转换为void * 。 这有什么意义吗?

也就是说,我不认为我曾经使用过void ** ,但是如果你需要一个void * s数组,那么类型将是void ** 。 (在C中) void *通常用于保存指向某些用户数据的指针 – 但您不会提前知道该数据的类型。 如果你有一个这样的数组,那么void **

因为你也有这个标记为C ++:前面的情况并不真正适用:你可以使用std::vector 。 真的, void *可能有问题 – 抽象基础可能更适合您的目的。 void *主要用于C.

void **是指向void *的指针。 void *可以来回转换为任何指针类型(包括void **)。 所以你可以这样做:

 char* -> void* void* -> void** void** -> void* void* -> char* 

你做不到:

 char* -> void** void** -> char* 

所以他们不一样。

void *可以保存任何指针。 由于没有实际的void对象, void *始终是指向其他类型的指针。

void **是指向void的指针或void *的地址的指针,即指向void的指针的地址。 这是一个实际类型,没有任何魔法属性。

但是因为void *可以保存任何指针,所以它也可以保持例如void **

 void **f(int x) { static void *y; static int *iy; y = &x; iy = &x; // return &iy; // not ok return &y; // ok } 

如果你想存储一些指针或任何东西,你可能会使用void *。

但是,如果你想编写一个能够初始化这个魔术指针的函数,那么你需要将这个参数作为void **传递给这个函数

 void fun1(); int fun2(int); double fun3(long); bool fun4(int, long, double); int rand(void** pp) { switch(time()%4) { case 0: *pp = fun1; return 0; case 1: *pp = fun2; return 1; case 2: *pp = fun3; return 2; case 3: *pp = fun4; return 3; } } int main() { void* pointer; int funId; funId = rand(&pointer); setCallback(pointer, funId); } 

一个主要区别是您以粗体引用的规则不适用于void **。

void *是一个指针(或指向未知类型数组开头的指针)。 void *是指向指针地址的指针(或指向2D数组开头的指针)。

此外,如果您使用C(而不是C ++)编写,则没有by-reference参数,只能通过值或指针。

例如

 // By value C and C++ void MyFunction(int a) { } // By pointer C and C++ void MyFunction(int* a) { } // By reference C++ only void MyFunction(int& a) { } 

如果你想要一个修改指针地址的函数(例如void * ptr;)
并使调用代码受到更改的影响,
那么你需要通过引用传递ptr传递指针到(void *&)并在函数内部使用ptr
或者传递一个指向指针的指针(void **)并传递&ptr并在函数内部使用* ptr。