遇到一個類型轉換的問題,當我試圖將void*類型的a轉化為string型的b時,這樣寫:
1 1 void *a; 2 2 string b; 3 3 b = (string)(*a); //錯誤
出現如下錯誤:
error: 'void*' is not a pointer-to-object type(void*不是指向對象的類型)
正確代碼:
void *a; string b; b = *(string*)a;
將a先轉化為string的指針然后解引用,賦值給b(對string指針的解引用獲得的當然是string類型)。
揪根問底(C/C++):
void*表示“空類型指針”,表示:任意類型的指針,或者該指針與一地址值相關,但是不清楚在此地址上的對象的類型。
不能直接對void*類型解引用,因為不存在void類型的變量。
void關鍵字表示“空類型”,表示不存在的意思,而非表示任意類型,因此可以用void修飾函數( void a(void); 表示函數無返回值,或者返回值為空 return; ,在函數形參位置表示函數沒有形參),但不能用void修飾變量,也就是不能寫語句 void a; ,不存在類型為void的東西。
再進一步,為什么不能存在void類型的變量,或者說為什么在面對變量的時候,void就不能表示“任意類型”呢?
我們知道C/C++是靜態類型的語言,定義變量就會分配內存,然而不同類型的變量所占內存不同,如果定義一個任意類型的變量,如何為其分配內存?
所以,C、C++中沒有任意類型的變量。但是,所有指針類型的變量,無論是int*、char*、string*、Student*等等,他們的內存空間都是相同的,所以可以定義“任意類型的指針”,指針類型所占的內存與系統的尋址能力有關,例如32位系統占4字節,64位系統占8字節……