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

时间:2010-06-11 22:56:59

标签: c++ c pointers

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

我在某处读到了这一行。这是否意味着void*void**相同? 有什么区别?

修改

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

6 个答案:

答案 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。