間接取值和傳址運算子
一元間接運算子 (*
) 會透過指標間接存取值。 運算元必須是指標類型。 運算的結果為由運算元定址的值,即其運算元指向位址的值。 結果的類型是運算元所定址的類型。
如果運算元的類型是類型指標,則間接取值運算子的結果為類型。 如果運算元指向某個函式,則結果為函式指示項。 如果其指向物件,則結果為指定物件的左值。
如果指標值無效,則間接運算子的結果未定義。 以下是使指標值失效的一些最常見條件:
指標是一個 null 指標。
指標會在參考時在其存留期結束之後指定對象的位址。 (例如,已脫離範圍或已解除分配的物件。
指標會指定針對所指向物件類型不適當對齊的位址。
指標指定了執行中程式未使用的位址。
一元傳址運算子 (&
) 提供其運算元的位址。 操作數必須是下列其中一項:
指定未宣告
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
) 則在初始化時使用傳址運算子。 兩個初始化相同。