程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C 說話指針變量的運算詳解

C 說話指針變量的運算詳解

編輯:關於C++

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說話的指針變量運舉動當作的具體的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved