这是一个特殊的属性,void *也可以被指定一个指向指针的指针并被反弹并接收原始值。
我在某处读到了这一行。这是否意味着void*
和void**
相同?
有什么区别?
修改
void*
可以保存任何指针。那么void**
需要什么?
答案 0 :(得分:53)
一个人指着一个黑洞。
指向黑洞的其他点。
它们实际上不是一回事,但指针可以转换为void *
。您可以将int *
转换为void *
,因为它是一个指针。 void **
仍然一个指针(它只指向一个指针),因为它是一个指针,你可以将它转换为void *
。这有什么意义吗?
那就是说,我认为我没有使用void **
,但是如果你需要一个void *
的数组,那么类型将是void **
。 (在C中)void *
通常用于保存指向某些用户数据的指针 - 但您不会提前知道该数据的类型。如果您有一组数组,那么void **
。
由于您还将此标记为C ++:之前的情况并不真正适用:您可以使用std::vector<void *>
。实际上,void *
可能有问题 - 抽象基础可能更适合您的目的。 void *
主要用于C。
答案 1 :(得分:6)
void **是指向void *的指针。 void *可以来回转换为任何指针类型(包括void **)。所以你可以这样做:
char* -> void*
void* -> void**
void** -> void*
void* -> char*
你可以不做:
char* -> void**
void** -> char*
所以他们不一样。
答案 2 :(得分:3)
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
}
答案 3 :(得分:2)
如果你想存储一些指针或任何东西,你可能会使用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);
}
答案 4 :(得分:1)
一个主要区别是您以粗体引用的规则不适用于void **。
答案 5 :(得分:0)
void *是一个指针(或指向未知类型数组开头的指针)。 void *是指向指针地址的指针(或指向2D数组开头的指针)。
另外,如果你用C语言编写(而不是用C ++编写),那么就没有by-reference参数,只能通过值或指针。
E.g。
// 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 *&amp;)并在函数
中使用ptr
或传递一个指向指针的指针(void **)并传递&amp; ptr并在函数内部使用* ptr。