本文討論使用指標進行的運算,最重要的運算是獲取指標所參照的物件或函數。也可以比較指標,使用指標來遍歷一個記憶體區域。
使用指標讀取與修改物件
間接運算子 * 生成記憶體中的位置,該位置的地址儲存在一個指標中。如果 ptr 是一個指標,那麼 *ptr 就是 ptr 所指向的物件(或函數)。
使用間接運算子有時候被稱為
解除參照(dereferencing)
一個指標。指標指向的記憶體位置被認為儲存有一個物件,指標的型別決定了該物件的型別。例如,當用 int 指標獲取一個特定記憶體位置,讀出或寫入的也是 int 型別的物件。
與乘法運算子 * 不同,間接運算子 * 是一元運算子,也就是說,間接運算子只有一個運算元。在例 1 中,ptr 指向變數 x。因此,表示式 *ptr 等效於變數 x 本身。
【例1】解除參照一個指標
double x, y, *ptr; // 兩個double變數和一個double指標
ptr = &x; // 使得ptr指向x
*ptr = 7.8; // 對變數x賦值7.8
*ptr *= 2.5; // 將x乘以2.5
y = *ptr + 0.5; // 將加法x+0.5的結果賦值給y
不要混淆指標宣告中的星號(*)和間接運算子。宣告中的語法可以被視為展示了如何使用指標。如下例所示:
double *ptr;
如上述宣告,ptr 具有 double* 型別(讀為:“指向double的指標”)。因此,表示式 *ptr 型別是 double。
當然
,間接運算子 * 必須匹配一個具有有效地址的指標。這個用法要求在編寫程式時需要特別小心!例 1 中,如果沒有 ptr=&x 為 ptr 分配有效地址,那麼所有包含 *ptr 的語句都是沒有意義的(解除參照一個沒有定義的指標),有可能會造成程式崩潰。
一個指標變數,其本身也是記憶體中的一個物件,也就是說,
其他指標可以指向該指標。若想建立指標的指標,必須使用兩個星號,如下例所示:
char c = 'A', *cPtr = &c, **cPtrPtr = &cPtr;
表示式 *cPtrPtr 當前生成 char 指標 cPtr,而 **cPtrPtr 的值是 char 變數 c。圖 1 展示了這樣的關係。
圖1