共用方式為


間接和傳址運算子

一元間接運算子 (*) 透過指標間接存取值。 運算元必須是指標類型。 運算的結果為由運算元定址的值,即其運算元指向位址的值。 結果的類型是運算元所定址的類型。

如果運算元的類型是類型指標,則間接取值運算子的結果為類型。 如果運算元指向某個函式,則結果為函式指示項。 如果其指向物件,則結果為指定物件的左值。

如果指標值無效,則間接運算子的結果為未定義。 以下是使指標值失效的一些最常見條件:

  • 指標是一個 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) 則在初始化時使用傳址運算子。 兩個初始化相同。

另請參閱

間接運算子: *
位址運算子: &