間接和傳址運算子
一元間接運算子 (*
) 透過指標間接存取值。 運算元必須是指標類型。 運算的結果為由運算元定址的值,即其運算元指向位址的值。 結果的類型是運算元所定址的類型。
如果運算元的類型是類型指標,則間接取值運算子的結果為類型。 如果運算元指向某個函式,則結果為函式指示項。 如果其指向物件,則結果為指定物件的左值。
如果指標值無效,則間接運算子的結果為未定義。 以下是使指標值失效的一些最常見條件:
指標是一個 null 指標。
指標會指定物件在參考期間存留期結束之後的位址。 (例如,超出範圍或已解除配置的物件。)
指標會指定不適當對齊指向之物件類型的位址。
指標指定了執行中程式未使用的位址。
一元傳址運算子 (&
) 提供其運算元的位址。 運算元必須是下列其中一項:
lvalue,指定未宣告
register
且不是位欄位的物件。一元取值 () 或陣列取值
*
[]
() 運算子的結果。函式指示項。
結果是類型為 operand_type運算元operand_type指標。
如果運算元是一元 *
運算子的結果,則不會評估兩個運算子,而且結果會如同同時省略兩者一樣。 結果不是左值,而且運算子上的條件約束仍然適用。 如果運算元是運算子的結果 []
, &
則不會評估運算子和運算子所隱含的 []
一元 *
。 結果的效果與移除 &
運算子和將 []
運算子變更為 +
運算子相同。 否則,結果就是運算元指定之物件或函式的指標。
範例
下列是使用這些常見宣告的範例:
int *pa, x;
int a[20];
此陳述式使用傳址運算子 (&
) 取得陣列 a
第六個元素的位址。 結果會儲存在指標變數 pa
:
pa = &a[5];
此範例中使用間接取值運算子 (*
) 來在儲存於 pa
中的位址存取 int
值。 該值已指派給整數變數 x
:
x = *pa;
此範例示範對 x
位址套用間接取值運算子的結果與 x
相同:
assert( x == *&x );
此範例示範宣告函式指標的對等方式:
int roundup( void ); /* Function declaration */
int *proundup = roundup;
int *pround = &roundup;
assert( pround == proundup );
宣告 roundup
函式後,就會宣告及初始化 roundup
的兩個指標。 第一個指標 (proundup
) 只使用函式的名稱初始化,而第二個指標 (pround
) 則在初始化時使用傳址運算子。 兩個初始化相同。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應