注意:這僅僅是因為很多初學者需要掌握這個概念。
它是什麼
----------
指標是地址。它們可以被賦值,或者被設定為“指向”另一個記憶體位置。它們是一個強大的概念,但被許多C語言使用者所誤解。它們的使用可以使程式碼更高效、更易讀、功能更強大。
如何使用它
-------------
指標的宣告使用以下模板(假設T是一個型別)
當然,有些人更喜歡以下約定
但這些修改屬於使用者個人觀點,因為編譯器會忽略宣告中的空格(除非它們分隔了型別和第一個變數)。
普通變數的地址可以像這樣賦值給指標
1 2 3
|
T *ptr;
T var;
ptr=&var;
|
這是有效的,因為“與”號(&)會獲取變數的地址,並將該值賦給指標,而指標本身就儲存著一個地址。
可以建立指向指標的指標。也可以建立指向這些指標的指標,但它們很少有用。
星號(*)可以解引用指標。
1 2 3 4 5 6
|
T *ptr;
T var, var2;
ptr=&var;
var2=*ptr;
*ptr+=var2;
|
最後兩行語句有效地將var2賦值為var的值(因為解引用運算子指示機器跟隨指標指向變數),然後將var2加到var上(相當於將var翻倍)。由於解引用的指標與var指向同一個位置,因此對解引用的指標的所有操作都會影響它所指向的變數。
通常,為了表示不指向任何東西的狀態,指標會被賦值為0。這個指標就是空指標。解引用空指標是非法的。
可以透過在宣告的星號前加上關鍵字const來宣告常量指標
不要將此與以下程式碼混淆
這定義了一個變數var,它指向一個常量T型別。常量指標必須被初始化。事實上,陣列就是常量指標。
為指標分配的空間是容納記憶體地址所需的空間。這通常是一個無符號長整型。
指標可以重定向到多個目標。例如
1 2 3 4 5 6 7 8
|
T *ptr;
T var, var2;
ptr=&var;
//Do some stuff with var
ptr=&var2;
//Do some stuff with var2
|
指標有自己的算術運算:加或減一個值(比如X)實際上會導致地址偏移X*sizeof(T)。這就是陣列解引用的方式(表示式a[x]實際上是*(a+x),這之所以有效是因為陣列是常量指標)。不允許乘法和除法。
指向任何任意型別T的指標必須宣告為T * 或特殊型別void *。void指標(不要與空指標混淆)可以被賦給任何型別的值的地址。因此,void指標的指標算術和解引用都是非法的。然而,你可以對強制轉換後的void指標進行解引用和算術運算。
指標定義不會隱式地擴充套件到宣告中的每個成員,你需要為每個指標變數加上星號。
你為什麼需要它們
-----------------
陣列,陣列,陣列!!!每個陣列都是一個常量指標,因此擁有這項功能非常重要。
函式通常傳遞引數的副本。透過傳遞地址(並將函式定義為接收指標),可以修改呼叫者的值。這種傳遞方式稱為引用傳遞。
指標對於字串處理至關重要。每個C字串都是一個字元陣列,因此是一個指向字元的常量指標。
在建立連結串列和使用動態記憶體分配時也需要它們。使用指標進行動態記憶體分配意味著你可以
-使用同一個指標指向多個獨立的記憶體空間。
-將此值賦給任何其他相同型別或void *的指標。
-定義一個任意長度的範圍來由單個指標管理。這是陣列的基礎。
深入學習
-------------
繼續,試試幾個指標操作。請記住,你需要強制轉換void指標才能使用它。
指標在多個場合被內部使用。沒有一個程式不包含指標,因為函式就是指向它們在資料段中編譯程式碼的指標(是的,包括main函式)。尋找其他類似的用途。
您的回覆非常有價值!請在下方提出您的問題和評論!
謝謝,
Graham Northup