和c語言中其他變數一樣,使用指標變數前必須先對它們進行宣告。
為了宣告乙個指標變數,需要使用以下宣告句法:
雖然指向整型的指標和指向字元型的指標在計算機內部都是以位址形式表示的,但兩者在c語言中還是有區別的。
要使用該位址中的資料,編譯程式必須知道如何解釋位址裡的資料,因此就要求顯式地說明指標所指向的資料的型別。
因此,指向整型的指標的基本型別為int
。
若使用同乙個宣告語句來宣告兩個同型別的指標,必須給每個變數都加上星號標誌,如:
int *p1, *p2;
而宣告
int *p1, p2;
則表示宣告p1為指向整型的指標,而p2是整型變數。
注:* 操作產生乙個左值,說明可以賦乙個值給乙個間接引用的指標。
為了更好地說明,考慮以下宣告:
int x, y;
int *p1, *p2;
這些宣告為四個字分配了記憶體空間,兩個字是int
型別,另外兩個字是指向整型的指標。
可以用賦值語句給x
和y
賦值,如:
x = -42;
y = 163;
產生如上圖 b) 所示的記憶體狀態。
為了初始化指標變數p1
和p2
,需要將那些表示整型物件的位址的值賦給它們。
即,用&把x
和y
的位址分別賦給p1
和p2
:
p1 = &x;
p2 = &y;
上述賦值操作將記憶體變成了上圖 c) 所示的狀態。
p1
和p2
中的指標值再一次具有了指向它們所引用的變數的直觀效果,可以用箭頭將該關係用上圖 d) 表示。
從指標轉向它所指向的值,可使用*運算子。
如,表示式
*p1
指出了p1
指向的記憶體位置裡所存放的值。
由於p1
被宣告為指向整數的指標,所以編譯器知道表示式 ∗p1
*p_1
∗p1
一定指乙個整數。
因此,假設記憶體結構如上圖所示,那麼,∗p1
*p_1
∗p1
就是變數x
的另外乙個名字。
和簡單變數x
一樣,表示式 ∗p1
*p_1
∗p1
是乙個左值,而且可以給它賦新值。
如,執行賦值語句
*p1 = 17;
會改變變數x
的值,因為p1
指向變數x
。
賦值後,記憶體結構如下圖所示:
由此可見,p1
的值本身沒有因賦值而受到影響,
其值仍然為1000,所以仍然指向變數x
。
同樣可以給指標變數本身賦新值。如
p1 = p2;
令計算機取出變數p2
的值並將該值複製給變數p1
。
p2
的值是指標值1004。由此,p1
和p2
就會同時指向變數y
,如下圖所示:
注意:區分指標賦值和值賦值是很重要的。形如
p1 = p2;
的指標賦值,使p1和p2指向同一位置。
而語句
*p1 = *p2;
的值賦值,是把以p2為位址的記憶體位置裡的值複製到以p1為位址的記憶體位置裡去。
c語言定義了乙個特殊的常量null。常量null可以賦給任何指標變數,在機器內部表示為位址值0。
null值的目的是表示指標不指向有效資料,所以想要找出和null指標有關的資料是沒有意義的。
常見錯誤:
不要間接引用沒有初始化或值為null的指標,這樣會引用不屬於本程式的記憶體空間,很可能使程式崩潰。
參考《c語言的科學和藝術》 —— 13 指標
2 C語言位操作
常用位操作 在這裡插入描述 位異或 兩位都相等,結果為0,不相等則為1 左移位 將乙個運算元的各二進位制全部左移若干位,左邊移除出去的二進位制位丟棄,右邊的二進位制位補0。每進行一次左移位操作,得到的結果是原來運算元的一倍 x n x 2 n 位操作與暫存器 暫存器的操作 1 暫存器特定位的清零用 ...
C語言指標2
include 指標函式 char getword char char getword char c int main include 指標函式 char getword char char getword char c int main include 函式指標 指向函式的指標 int squar...
C語言指標2
字元指標 在指標的型別中,字元指標表示方式char 一般使用 int main 不常見 int main char pstr hello world 本質是把字串 首字元的位址放到了pstr中。而非把字串放入指標中。也就是說將常量字串 hello world 的首字元h的位址存放到指標pstr中。i...