2011-12-16 161 views
57

可能重複:
What is a void pointer and what is a null pointer?什麼是C++中的void指針?

我經常看到代碼,類似於像下面這樣:

void * foo(int bar);

這是什麼意思?這是否意味着它可以返回什麼?這與C#中的dynamicobject類似嗎?

+0

類似問題的鏈接:http://stackoverflow.com/questions/4334831/what-is-a-void-pointer-and-what-is-a-null-pointer – ksming 2011-12-16 05:17:46

+0

它與`動態無關`並且與`object`只有很大的「相似性」。 – 2011-12-16 05:18:02

回答

69

A void*並不意味着什麼。它是一個指針,但它指向的類型是未知的。

這並不是說它可以返回任何東西。返回void*的函數一般會執行以下操作之一:

  • 它正在處理未格式化的內存。這是operator newmalloc返回的內容:指向特定大小內存塊的指針。由於內存沒有類型(因爲它沒有一個適當構造的對象),它是無類型的。 IE:void
  • 這是一個不透明的手柄;它引用一個創建的對象而不命名特定的類型。這樣做的代碼通常構造不佳,因爲通過forward聲明一個結構/類並且不提供公共定義可以更好地完成此操作。因爲那樣,至少它有一個真實的類型。
  • 它有明確的文件告訴你可以使用指針的類型。

這是什麼dynamicobject在C#。那些結構實際上知道原始類型是什麼; void*不是。這使得它比其中任何一個更危險,因爲它很容易弄錯。

並且在個人記錄中,如果您看到使用void*的「經常」代碼,則應該重新考慮您正在查看的代碼。 void*用法,尤其是在C++中應該很少見,主要用於處理原始內存。

4

void *可以指向任何東西(這是一個沒有任何類型信息的原始指針)。

+7

任何指針都可以指向任何東西。 – 2011-12-16 05:21:46

22

A void*指針用於指示指向大塊內存而不指定類型的指針。 C的malloc返回這樣一個指針,期望您立即將其轉換爲特定類型。直到將其轉換爲另一個指針類型時,它才真正有用。您需要知道將其轉換爲哪種類型,編譯器沒有反射能力來知道底層類型應該是什麼。

+0

那麼,C的`malloc`實際上並不期望你立即將它轉換爲其他東西,因爲在C中,`void *`會自動提升爲一個真正的指針類型:http://stackoverflow.com/q/605845/ 837703。 C++是一個不同的故事,但你應該在C++中使用`new`。 – 2015-07-11 22:12:48

+1

@ArkaMajumdar隱式演員仍然是演員。指針的類型發生變化,這使得它變得有用。 – 2015-07-12 00:44:28

20

Void用作關鍵字。指針,也稱爲泛型指針,是一種特殊類型的指針,可以指向任何數據類型的對象!一個空指針被宣佈像一個正常的指針,用void關鍵字作爲指針的類型:

常規語法:

void* pointer_variable; 

void *pVoid; // pVoid is a void pointer 

一個空指針可以指向任何數據類型的對象:

int nValue; 
float fValue; 

struct Something 
{ 
    int nValue; 
    float fValue; 
}; 

Something sValue; 

void *pVoid; 
pVoid = &nValue; // valid 
pVoid = &fValue; // valid 
pVoid = &sValue; // valid 

但是,由於void指針不知道它指向的是什麼類型的對象,因此無法解除引用!相反,void引用必須首先明確地轉換爲另一個指針類型,然後才能解除引用。

int nValue = 5; 
void *pVoid = &nValue; 

// can not dereference pVoid because it is a void pointer 

int *pInt = static_cast<int*>(pVoid); // cast from void* to int* 

cout << *pInt << endl; // can dereference pInt