国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C 語言指針變量的運(yùn)算詳解

2020-01-26 14:27:57
字體:
供稿:網(wǎng)友

指針變量保存的是地址,本質(zhì)上是一個整數(shù),可以進(jìn)行部分運(yùn)算,例如加法、減法、比較等,請看下面的代碼:

#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);  //加法運(yùn)算  pa++; pb++; pc++;  printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X/n", &a, pa, pb, pc);  //減法運(yùn)算  pa -= 2; pb -= 2; pc -= 2;  printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X/n", &a, pa, pb, pc);  //比較運(yùn)算  if(pa == paa){    printf("%d/n", *paa);  }else{    printf("%d/n", *pa);  }  return 0;}

運(yùn)行結(jié)果:

&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

從運(yùn)算結(jié)果可以看出:pa、pb、pc 每次加 1,它們的地址分別增加 4、8、1,正好是 int、double、char 類型的長度;減 2 時,地址分別減少 8、16、2,正好是 int、double、char 類型長度的 2 倍。

這很奇怪,指針變量加減運(yùn)算的結(jié)果跟數(shù)據(jù)類型的長度有關(guān),而不是簡單地加 1 或減 1,這是為什么呢?

以 a 和 pa 為例,a 的類型為 int,占用 4 個字節(jié),pa 是指向 a 的指針,如下圖所示:

剛開始的時候,pa 指向 a 的開頭,通過 *pa 讀取數(shù)據(jù)時,從 pa 指向的位置向后移動 4 個字節(jié),把這 4 個字節(jié)的內(nèi)容作為要獲取的數(shù)據(jù),這 4 個字節(jié)也正好是變量 a 占用的內(nèi)存。

如果pa++;使得地址加 1 的話,就會變成如下圖所示的指向關(guān)系:

這個時候 pa 指向整數(shù) a 的中間,*pa 使用的是紅色虛線畫出的 4 個字節(jié),其中前 3 個是變量 a 的,后面 1 個是其它數(shù)據(jù)的,把它們“攪和”在一起顯然沒有實際的意義,取得的數(shù)據(jù)也會非常怪異。

如果pa++;使得地址加 4 的話,正好能夠完全跳過整數(shù) a,指向它后面的內(nèi)存,如下圖所示:

我們知道,數(shù)組中的所有元素在內(nèi)存中是連續(xù)排列的,如果一個指針指向了數(shù)組中的某個元素,那么加 1 就表示指向下一個元素,減 1 就表示指向上一個元素,這樣指針的加減運(yùn)算就具有了現(xiàn)實的意義,我們將在《C語言和數(shù)組》一節(jié)中深入探討。

不過C語言并沒有規(guī)定變量的存儲方式,如果連續(xù)定義多個變量,它們有可能是挨著的,也有可能是分散的,這取決于變量的類型、編譯器的實現(xiàn)以及具體的編譯模式,所以對于指向普通變量的指針,我們往往不進(jìn)行加減運(yùn)算,雖然編譯器并不會報錯,但這樣做沒有意義,因為不知道它后面指向的是什么數(shù)據(jù)。

下面的例子是一個反面教材,警告讀者不要嘗試通過指針獲取下一個變量的地址:

#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 模式下的運(yùn)行結(jié)果為:

3, -858993460, -858993460, 2, -858993460, -858993460, 1, -858993460,

可以發(fā)現(xiàn),變量 a、b、c 并不挨著,它們中間還參雜了別的輔助數(shù)據(jù)。

指針變量除了可以參與加減運(yùn)算,還可以參與比較運(yùn)算。當(dāng)對指針變量進(jìn)行比較運(yùn)算時,比較的是指針變量本身的值,也就是數(shù)據(jù)的地址。如果地址相等,那么兩個指針就指向同一份數(shù)據(jù),否則就指向不同的數(shù)據(jù)。

上面的代碼(第一個例子)在比較 pa 和 paa 的值時,pa 已經(jīng)指向了 a 的上一份數(shù)據(jù),所以它們不相等。而 a 的上一份數(shù)據(jù)又不知道是什么,所以會導(dǎo)致 printf() 輸出一個沒有意義的數(shù),這正好印證了上面的觀點,不要對指向普通變量的指針進(jìn)行加減運(yùn)算。

另外需要說明的是,不能對指針變量進(jìn)行乘法、除法、取余等其他運(yùn)算,除了會發(fā)生語法錯誤,也沒有實際的含義。

以上就是對C語言的指針變量運(yùn)算做的詳細(xì)的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 伊金霍洛旗| 贡嘎县| 阳江市| 西乌| 来安县| 孝感市| 克东县| 文安县| 宝丰县| 深水埗区| 桂东县| 来宾市| 大兴区| 西吉县| 石景山区| 孟村| 来凤县| 凤台县| 无极县| 静乐县| 孝义市| 日照市| 报价| 新密市| 中西区| 特克斯县| 南溪县| 沙河市| 常州市| 宜州市| 武宁县| 黄浦区| 昭通市| 阳东县| 峨眉山市| 伊川县| 忻城县| 兴仁县| 马鞍山市| 卢龙县| 吴江市|