C 說話指針變量的運算詳解。本站提示廣大學習愛好者:(C 說話指針變量的運算詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C 說話指針變量的運算詳解正文
指針變量保留的是地址,實質上是一個整數,可以停止部門運算,例如加法、減法、比擬等,請看上面的代碼:
#include <stdio.h> int main(){ int a = 10, *pa = &a, *paa = &a; double b = 99.9, *pb = &b; char c = '@', *pc = &c; //最後的值 printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X\n", &a, pa, pb, pc); //加法運算 pa++; pb++; pc++; printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X\n", &a, pa, pb, pc); //減法運算 pa -= 2; pb -= 2; pc -= 2; printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X\n", &a, pa, pb, pc); //比擬運算 if(pa == paa){ printf("%d\n", *paa); }else{ printf("%d\n", *pa); } return 0; }
運轉成果:
&a=0X28FF44, pa=0X28FF44, pb=0X28FF30, pc=0X28FF2B
&a=0X28FF44, pa=0X28FF48, pb=0X28FF38, pc=0X28FF2C
&a=0X28FF44, pa=0X28FF40, pb=0X28FF28, pc=0X28FF2A
2686784
從運算成果可以看出:pa、pb、pc 每次加 1,它們的地址分離增長 4、8、1,正好是 int、double、char 類型的長度;減 2 時,地址分離削減 8、16、2,正好是 int、double、char 類型長度的 2 倍。
這很奇異,指針變量加減運算的成果跟數據類型的長度有關,而不是簡略地加 1 或減 1,這是為何呢?
以 a 和 pa 為例,a 的類型為 int,占用 4 個字節,pa 是指向 a 的指針,以下圖所示:
剛開端的時刻,pa 指向 a 的開首,經由過程 *pa 讀取數據時,從 pa 指向的地位向後挪動 4 個字節,把這 4 個字節的內容作為要獲得的數據,這 4 個字節也正好是變量 a 占用的內存。
假如pa++;使得地址加 1 的話,就會釀成以下圖所示的指向關系:
這個時刻 pa 指向整數 a 的中央,*pa 應用的是白色虛線畫出的 4 個字節,個中前 3 個是變量 a 的,前面 1 個是其它數據的,把它們“攪和”在一路明顯沒有現實的意義,獲得的數據也會異常奇異。
假如pa++;使得地址加 4 的話,正好可以或許完整跳過整數 a,指向它前面的內存,以下圖所示:
我們曉得,數組中的一切元素在內存中是持續分列的,假如一個指針指向了數組中的某個元素,那末加 1 就表現指向下一個元素,減 1 就表現指向上一個元素,如許指針的加減運算就具有了實際的意義,我們將在《C說話和數組》一節中深刻商量。
不外C說話並沒有劃定變量的存儲方法,假如持續界說多個變量,它們有能夠是挨著的,也有能夠是疏散的,這取決於變量的類型、編譯器的完成和詳細的編譯形式,所以關於指向通俗變量的指針,我們常常不停止加減運算,固然編譯器其實不會報錯,但如許做沒成心義,由於不曉得它前面指向的是甚麼數據。
上面的例子是一個不和教材,正告讀者不要測驗考試經由過程指針獲得下一個變量的地址:
#include <stdio.h> int main(){ int a = 1, b = 2, c = 3; int *p = &c; int i; for(i=0; i<8; i++){ printf("%d, ", *(p+i) ); } return 0; }
在 VS2010 Debug 形式下的運轉成果為:
3, -858993460, -858993460, 2, -858993460, -858993460, 1, -858993460,
可以發明,變量 a、b、c 其實不挨著,它們中央還參雜了其余幫助數據。
指針變量除可以介入加減運算,還可以介入比擬運算。當對指針變量停止比擬運算時,比擬的是指針變量自己的值,也就是數據的地址。假如地址相等,那末兩個指針就指向統一份數據,不然就指向分歧的數據。
下面的代碼(第一個例子)在比擬 pa 和 paa 的值時,pa 曾經指向了 a 的上一份數據,所以它們不相等。而 a 的上一份數據又不曉得是甚麼,所以會招致 printf() 輸入一個沒成心義的數,這正好印證了下面的不雅點,不要對指向通俗變量的指針停止加減運算。
別的須要解釋的是,不克不及對指針變量停止乘法、除法、取余等其他運算,除會產生語法毛病,也沒有現實的寄義。
以上就是對C說話的指針變量運舉動當作的具體的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!