欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年08月23日 10:42:14   投稿:lqh  
本文主要介紹 C語(yǔ)言指針變量運(yùn)算的知識(shí),這里整理了詳細(xì)的知識(shí)點(diǎn),并附示例代碼,有需要學(xué)習(xí)C語(yǔ)言指針的朋友可以參考下

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

#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 類型的長(zhǎng)度;減 2 時(shí),地址分別減少 8、16、2,正好是 int、double、char 類型長(zhǎng)度的 2 倍。

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

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

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

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

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

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

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

不過(guò)C語(yǔ)言并沒有規(guī)定變量的存儲(chǔ)方式,如果連續(xù)定義多個(gè)變量,它們有可能是挨著的,也有可能是分散的,這取決于變量的類型、編譯器的實(shí)現(xiàn)以及具體的編譯模式,所以對(duì)于指向普通變量的指針,我們往往不進(jìn)行加減運(yùn)算,雖然編譯器并不會(huì)報(bào)錯(cuò),但這樣做沒有意義,因?yàn)椴恢浪竺嬷赶虻氖鞘裁磾?shù)據(jù)。

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

#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)對(duì)指針變量進(jìn)行比較運(yùn)算時(shí),比較的是指針變量本身的值,也就是數(shù)據(jù)的地址。如果地址相等,那么兩個(gè)指針就指向同一份數(shù)據(jù),否則就指向不同的數(shù)據(jù)。

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

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

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

相關(guān)文章

  • 詳解C++中的常量

    詳解C++中的常量

    這篇文章主要介紹了C++中的常量的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • stringstream操縱string的方法總結(jié)

    stringstream操縱string的方法總結(jié)

    下面小編就為大家?guī)?lái)一篇stringstream操縱string的方法總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • 使用VC6.0對(duì)C語(yǔ)言程序進(jìn)行調(diào)試的基本手段分享

    使用VC6.0對(duì)C語(yǔ)言程序進(jìn)行調(diào)試的基本手段分享

    這篇文章主要介紹了用VC6.0開發(fā)c語(yǔ)言程序的時(shí)候調(diào)試代碼的一些小技巧,需要的朋友可以參考下
    2013-07-07
  • C++模擬鍵盤按鍵的實(shí)例

    C++模擬鍵盤按鍵的實(shí)例

    今天小編就為大家分享一篇C++模擬鍵盤按鍵的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • C++紅黑樹應(yīng)用之手搓set和map

    C++紅黑樹應(yīng)用之手搓set和map

    這篇文章主要為大家詳細(xì)介紹了如何使用紅黑樹封裝set和map,且必須保證兩種數(shù)據(jù)結(jié)構(gòu)復(fù)用同一棵紅黑樹,且滿足set和map的性質(zhì),set的value不可被改變,而map的value可以被改變,需要的可以參考一下
    2023-03-03
  • C++代碼實(shí)現(xiàn)網(wǎng)絡(luò)Ping功能

    C++代碼實(shí)現(xiàn)網(wǎng)絡(luò)Ping功能

    這篇文章主要介紹了C++代碼實(shí)現(xiàn)網(wǎng)絡(luò)Ping功能,Ping命令被送到本地計(jì)算機(jī)的IP軟件,該命令永不退出該計(jì)算機(jī),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-08-08
  • Vscode Remote Development遠(yuǎn)程開發(fā)調(diào)試的實(shí)現(xiàn)思路

    Vscode Remote Development遠(yuǎn)程開發(fā)調(diào)試的實(shí)現(xiàn)思路

    這篇文章主要介紹了Vscode Remote Development遠(yuǎn)程開發(fā)調(diào)試的相關(guān)資料,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • C 語(yǔ)言基礎(chǔ)教程(我的C之旅開始了)[六]

    C 語(yǔ)言基礎(chǔ)教程(我的C之旅開始了)[六]

    C 語(yǔ)言基礎(chǔ)教程(我的C之旅開始了)[六]...
    2007-02-02
  • 冒泡排序的三種實(shí)現(xiàn)方法

    冒泡排序的三種實(shí)現(xiàn)方法

    本篇文章是對(duì)冒泡排序的三種實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下。希望對(duì)大家有所幫助
    2013-10-10
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評(píng)論