先看個程式,是華為2023年招聘筆試題之一
#include
main();
int *p,*q;
p=a;
q=&a[2];
printf(" a[p-q]=%d/n q=%d/n p=%d/n q-p=%d/n",a[q-p],q,p,q-p);
getch();
}執行結果:
a[q-p] = 3
q = -42
p = -46
q-p = 2
6.3 指標的運算
指標的運算就是位址的運算。由於這一特點,指標運算不同於普通變數,它只允許有限的幾種運算。除了上一節介紹過的賦值運算可把指標指向某一儲存單元外,允許指標與整數相加、減,用來移動指標;允許兩個指標相減,可以得到兩個位址之間的資料個數;還允許指標與指標或指標與位址之間進行比較,可以決定指標所指向的儲存位置的先後。
6.3.1 指標與整數相加減(指標的移動)
可以通過對指標與乙個整數進行加、減運算來移動指標,例如:
p+np-np++p--++p--p
等,其中n是整數。進行加法運算時,表示p向位址增大的方向移動;進行減法運算時,表示p向位址減小的方向移動。移動的具體長度取決於指標的資料型別,由計算機自動確定。設p是指向type(type代表型別關鍵字)型別的指標,n是整型表示式,則p±n為乙個新位址,其值為p±n×sizeof(type),即在p原有值的基礎上增加或減少了n×sizeof(type)位元組。
例6.4
#include
main()
本程式的執行結果為:
a=1,b=2,c=3,d=4
x=2.500000,y=3.500000,z=4.500000
程式中各變數的儲存位置及指標移動情況如圖6-5所示。
圖6.5 指標與整數相加減(指標移動)示意圖
圖6.5中,指標pb存放的是整型變數b的位址(ff02),pb-1表示向位址減小的方向移動2位元組(乙個整型資料的長度),結果指向變數a的首位元組位址;pb+2表示向位址增大的方向移動4位元組(兩個整型資料的長度),結果指向變數d的首位元組位址。浮點型指標py存放的是浮點型變數y的位址(ff0e),py-1表示向位址減小的方向移動4位元組(乙個浮點型資料的長度),結果指向變數x的位址;py+1表示向位址增大的方向移動4位元組(乙個浮點型資料的長度),結果指向變數z的位址。因此,指標加、減乙個整數後,將指向另乙個位址。
初學者要注意,*p+n和*(p+n)是不同的,前者是先取值再加n,後者是先移動指標再取值。指標p進行p±n運算後,其結果得到乙個新的位址,即指向了新的儲存單元,而p本身的位址值並未發生變化,即它仍指向原來的儲存單元(如上例中pb、py分別指向變數b和y)。當對指標進行
p++p--++p--p
運算後,指標p本身的值會發生變化,即p不再指向原先的物件,而會指向新的物件。
例6.5
#include
main()
程式執行結果為:110
在進行p++之前和之後,各變數的儲存位置分別如圖6.6(a)和圖6.6(b)所示。
圖6.6 指標p++運算示意圖
從圖中可以看出,在進行p++運算之前,p指向變數a(p值為ff00),在進行了p++後,p指向變數b(p值為ff02)。
③由於*和++同屬乙個優先順序,其結合性均為從右至左,因此*p++與*(p++)等價,但不與(*p)++或++(*p)等價。
6.3.2 兩個同型別指標相減
兩個同型別的指標可以相減。如果這兩個指標之間所儲存的資料的型別也與指標相同(通常是陣列的情況),則相減的結果是這兩個指標之間所包含的資料個數。顯然,兩個指標相加是無意義的。
例6.6
#include
main()
程式執行結果為:
q-p=5
6.3.3 指標的比較
兩個同型別的指標,或者乙個指標和乙個位址量可以進行比較(包括》、<、>=、<=、==和!=),比較的結果可以反映出兩個指標所指向的目標的儲存位置之間的前後關係,或者反映出乙個指標所指向的目標的儲存位置與另乙個位址之間的前後關係。
例如,假定指標p和q都是指向同一陣列的成員,那麼關係表示式
p表示:如果p所指向的陣列元素在q所指向的陣列元素之前,其值為1;否則,為0。
不同型別指標之間或指標與一般的整型資料之間的比較是沒有實際意義的。但是指標與零之間進行等於或不等於的比較,即
p==0 或 p!=0(0也可以寫成/0''或null)
常用來判斷指標p是否為一空指標(即未指向任何目標)。
c語言 指標學習
最近重翻了c語言程式設計這本書,有了一些新的感觸,這本書從資料型別 運算子和表示式 迴圈和選擇結構 輸入輸出 陣列 指標 字串 函式 構造體和檔案操作等方面來深入淺出的介紹c語言。當然最令人印象深刻的是指標。指標是存放著變數的位址的變數的資料型別,換言之,指標變數儲存的是變數的位址值,由於指標可以直...
C語言指標學習
一 明確幾個符號 1 取位址符,取值符 1 char a 別用cha a null,容易引起歧義 例如char a b 其實是定義指標a,和char型變數b。定義多個指標用 char a null,b null 2 定義指標時初始化 因為指標a到底指向 我們不知道。隨便改變這個位址的值,可能導致一些...
c語言指標學習筆記
example 1 int a,b,p,q p a p a p q b p p a 錯誤,因為p實際上是乙個位址,而a是乙個整型值 p q 錯誤,因為這句話的意思是 將位址q指向的單元的值賦給位址p。而實際上p是乙個位址,是不能存值得 p a 錯誤 注意,如果這樣定義了 p,那麼 p表示位址 指標 ...