2014-04-05 27 views
1

這是我運行的是什麼:之前的星號?

pam_get_item(pamh, PAM_USER,(const void**)&pam_user); 

pamh是一個結構不是對這個問題很重要,並pamuser是一個空指針。此代碼編譯併成功執行。但是,這並不是:

pam_get_item(pamh, PAM_USER,(const **void)&pam_user); 

爲什麼星號在vs之前會有變化?謝謝!

+4

他們不改變意思,他們失去意義,即變得無效。編程語言的語法就是這樣。任意改變,垃圾(主要)。 –

+2

這只是非法的語法。很難辯論爲什麼語法變得非法。就是這樣。 –

+1

同樣,當您將發動機移動到保險槓前時,您的汽車會改變行爲,當您將您的腎臟移入顱腔時,您的身體會改變行爲。你不能只是把一部分工作,把它放在別的地方,並讓它繼續工作。 – user2357112

回答

2

星號是組成該類型名稱的組件。而類型名稱組件的順序影響它實際是什麼類型。

具體來說,星號會修改類型,使其成爲指向左側名稱的指針。所以,

void* 

這是一個指向void(即指向可能是任何類型的內存區域的指針)。

const void* 

而這是一個指向const void(即指針的存儲器的區域其或者是常量,或應當從這個指針的視圖考慮常數)。

const void** 

而且這是指向const void*的指針。

因此,考慮到這一點,你會期望這是:

const **void 

的空隙指向一個常量指針?無意義的。

+0

好吧,因爲我知道這樣的事情:'int * i'和'int * i'的工作。成本雖然是修飾詞,但不是類型。感謝您的解釋! – Goodies

+2

@Goodies這些實際上是一樣的東西。這裏的空白不相關。 – computerfreaker

2

類型轉換運算符是(type)其中type是有效的類型。要檢查type的語法是否合理,請嘗試定義類型爲type的變量。

(const void**)&pam_user // ok 
const void **x; // legal, meaningful 

(const **void)&pam_user // wrong 
const **void x; // wrong, meaningless 

const這裏符合這種類型void。那麼const後面的內容也應該是有效的類型。 ** void不是有效的類型。 const後沒有任何意義,**