間接取值和傳址運算子
間接取值運算子 (*) 透過指標間接存取的值。 運算元必須是指標值。 運算的結果是運算元 ; 所處理的值 也就是在其運算元所指向的位址的值。 結果的型別是解決運算元的型別。
如果運算元指向函式,則結果為函式指示項。 如果它指向的儲存位置時,結果會是左值指定的儲存位置。
如果指標值無效,則結果會是未定義的。 下列清單包含一些最常見的條件,使指標值無效。
指標是 null 指標。
指標指定本機項目未參考的次顯示的地的址。
指標指定的位址,指到的物件型別並未適當對齊。
指標會指定不執行程式所使用的位址。
傳址運算子 (與) 提供運算元的位址。 傳址運算子的運算元可以是左值,指定的物件,不是位元欄位並不以宣告或函式指示項註冊的儲存類別規範。
地址運算的結果是運算元的指標。 指標所討論的類型便是運算元的型別。
傳址運算子只能套用到基本,結構的變數,或在檔案範圍層級上,或者宣告的等位型別 subscripted 陣列參考。 在這些運算式中,常數運算式不包含傳址運算子可以加入或減去位址運算式。
範例
下列範例會使用這些宣告:
int *pa, x;
int a[20];
double d;
此陳述式會使用傳址運算子:
pa = &a[5];
傳址運算子 (與) 會使用陣列的第六個元素的位址a。 結果會儲存在指標變數pa。
x = *pa;
間接取值運算子 (*) 可在此範例中,存取int值之地址儲存在pa。 將值指派給整數變數x。
if( x == *&x )
printf( "True\n" );
本範例將列印 word True、 demonstrating,結果將間接取值運算子套用至的地址的x等同於x。
int roundup( void ); /* Function declaration */
int *proundup = roundup;
int *pround = &roundup;
一次的函式roundup宣告兩個指標roundup宣告和初始化。 第一個指標, proundup,初始化時使用的函式的名稱,第二個, pround,使用傳址運算子在初始化。 初始設定是相等的。