[英]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.