簡體   English   中英

void *和void **之間有什么區別?

[英]What's the difference between void* and void**?

這是一個特殊的屬性,void *也可以被指定一個指向指針的指針並被回送並接收原始值。

我在某處讀過這行。 這是否意味着void*void**是一樣的? 有什么不同?

編輯

void*可以保存任何指針。 那需要什么樣的void**

一個人指着一個黑洞。

其他指向黑洞的東西。


它們不是真的相同,但指針可以轉換為void * 你可以將int *轉換為void *因為它是一個指針。 void ** 仍然是一個指針(它只指向一個指針),因為它是一個指針,你可以將它轉換為void * 這有什么意義嗎?

也就是說,我認為我沒有使用過void ** ,但如果你需要一個void * s數組,那么類型將是void ** (在C中) void *通常用於保存指向某些用戶數據的指針 - 但您不會提前知道該數據的類型。 如果你有一個這樣的數組,那么void **

因為你也有這個標記為C ++:前面的情況並不真正適用:你可以使用std::vector<void *> 真的, 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM