這是我運行的是什麼:之前的星號?
pam_get_item(pamh, PAM_USER,(const void**)&pam_user);
pamh
是一個結構不是對這個問題很重要,並pamuser
是一個空指針。此代碼編譯併成功執行。但是,這並不是:
pam_get_item(pamh, PAM_USER,(const **void)&pam_user);
爲什麼星號在vs之前會有變化?謝謝!
這是我運行的是什麼:之前的星號?
pam_get_item(pamh, PAM_USER,(const void**)&pam_user);
pamh
是一個結構不是對這個問題很重要,並pamuser
是一個空指針。此代碼編譯併成功執行。但是,這並不是:
pam_get_item(pamh, PAM_USER,(const **void)&pam_user);
爲什麼星號在vs之前會有變化?謝謝!
星號是組成該類型名稱的組件。而類型名稱組件的順序影響它實際是什麼類型。
具體來說,星號會修改類型,使其成爲指向左側名稱的指針。所以,
void*
這是一個指向void(即指向可能是任何類型的內存區域的指針)。
const void*
而這是一個指向const void
(即指針的存儲器的區域其或者是常量,或應當從這個指針的視圖考慮常數)。
const void**
而且這是指向const void*
的指針。
因此,考慮到這一點,你會期望這是:
const **void
的空隙指向一個常量指針?無意義的。
好吧,因爲我知道這樣的事情:'int * i'和'int * i'的工作。成本雖然是修飾詞,但不是類型。感謝您的解釋! – Goodies
@Goodies這些實際上是一樣的東西。這裏的空白不相關。 – computerfreaker
類型轉換運算符是(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
後沒有任何意義,**
。
他們不改變意思,他們失去意義,即變得無效。編程語言的語法就是這樣。任意改變,垃圾(主要)。 –
這只是非法的語法。很難辯論爲什麼語法變得非法。就是這樣。 –
同樣,當您將發動機移動到保險槓前時,您的汽車會改變行爲,當您將您的腎臟移入顱腔時,您的身體會改變行爲。你不能只是把一部分工作,把它放在別的地方,並讓它繼續工作。 – user2357112