C 語言指標變數的運算詳解_C 語言

來源:互聯網
上載者:User

指標變數儲存的是地址,本質上是一個整數,可以進行部分運算,例如加法、減法、比較等,請看下面的代碼:

#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語言的指標變數運算做的詳細的資料整理,後續繼續補充相關資料,謝謝大家對本站的支援!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.