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。