• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      淺談C語(yǔ)言指針變量的“地址”與“值”

      2020-03-11 11:35:46
      福建質(zhì)量管理 2020年5期
      關(guān)鍵詞:數(shù)組指針字節(jié)

      (重慶三峽學(xué)院計(jì)算機(jī)科學(xué)與工程學(xué)院 重慶 404100)

      C語(yǔ)言指針數(shù)據(jù)類型是整個(gè)C語(yǔ)言教學(xué)的重點(diǎn)難點(diǎn)。指針這個(gè)詞是從英文單詞 “pointer”直譯而來(lái),事實(shí)上,指針更應(yīng)該翻譯為地址,指針變量稱之為地址變量更合適。由于指針數(shù)據(jù)類型的存在,使得C語(yǔ)言可以直接同計(jì)算機(jī)內(nèi)存打交道,這是C語(yǔ)言的低級(jí)語(yǔ)言特征。但是,由于指針變量的特殊性,使得C語(yǔ)言初學(xué)者在學(xué)習(xí)的時(shí)候往往感到很困惑,不知道何時(shí)取的是地址,何時(shí)取的是值。下面以一維數(shù)組和二維數(shù)組與指針變量的示例來(lái)理解指針變量的用法。

      一、指針和一維數(shù)組

      先來(lái)看指針和一維數(shù)組的關(guān)系,程序主要代碼如下:

      1:int arr[5]={1,2,3,4,5};

      2:int *p;

      3:p=arr;

      4:printf(“%x %x %x ”,p,arr,&arr[0]);

      5:printf(“%d %d %d %d ”,*p,*arr,arr[0],p[0]);

      以上程序定義了一維整型數(shù)組arr和指向此一維數(shù)組的整型指針變量p。在定義時(shí),符號(hào)*表示定義的是一個(gè)指針變量,符號(hào)[ ]表示定義的是一個(gè)數(shù)組。除了定義外,符號(hào)*和[ ]均具有“解地址”的功能,和另一個(gè)取地址符號(hào)“&”具有相反的功能,就像除法是乘法的逆運(yùn)算一樣。程序第4行運(yùn)行后均輸出十六進(jìn)制的地址,p是指針變量,由于程序第3行的賦值語(yǔ)句,p和arr均表示地址,但p是地址變量,值可變,arr為地址常量,值不能變,即p++,++p,p- -,- -p均是可行的,但arr自增自減不行。由于p賦值為arr數(shù)組名,即p此時(shí)表示arr數(shù)組首地址,也是arr數(shù)組第0個(gè)元素的地址,所以p,arr,&arr[0]地址相同。程序第5行運(yùn)行后均輸出的是arr數(shù)組第0個(gè)元素的值。由第4行全為地址如何變成第5行的全為值呢?有兩種方式,一種用“解地址”符號(hào)*,例如*p,*arr;另一種用“解地址”符號(hào)[ ],例如p[0],arr[0]。類似地,要表示arr數(shù)組第1個(gè)元素的地址,可以表示為p+1,arr+1,&arr[1]。要表示arr數(shù)組第1個(gè)元素的值,可以表示為*(p+1),*(arr+1),arr[1],p[1]。此時(shí),p和arr可以互換。那&p表示什么呢?指針變量是一種特殊的變量,變量中存的是其它變量的地址值,但是指針變量本身也是要占內(nèi)存空間的,所以&p表示的是指針變量p本身的地址,一般占4個(gè)字節(jié)或8個(gè)字節(jié),這取決于編譯器,例如VC++6.0給指針變量分配4個(gè)字節(jié)的空間,而DevC++給指針變量分配8個(gè)字節(jié)的空間。

      二、指針和二維數(shù)組

      接下來(lái)看指針和二維數(shù)組的關(guān)系,程序主要代碼如下:

      1:int a[3][4]={1,2,3,4,10,20,30,40,100,200,300,400};

      2:int(*p)[4];

      3:p=a;

      4:printf("%x %x %x %d %x %x %d %d ",a,*a,*a+1,**a,a+1,*(a+1),**(a+1),*(*(a+1)+2));

      5:printf("%x %x %x %d %x %x %d %d ",p,*p,*p+1,**p,p+1,*(p+1),**(p+1),*(*(p+1)+2));

      6:printf("%x %x %x ",a[2],&a[2],&a[2][0]);

      7:printf("%x %x %x ",p[2],&p[2],&p[2][0]);

      8:printf("%d %d %d ",a[2][1],*(a[2]+1),*(*(a+2)+1));

      9:printf("%d %d %d ",p[2][1],*(p[2]+1),*(*(p+2)+1));

      以上程序定義了一個(gè)3行4列的二維整型數(shù)組a和指向此二維數(shù)組的整型指針變量p,如第2行這樣定義的指針變量相當(dāng)于行指針,可以用來(lái)遍歷二維數(shù)組a的行,它與指向一維數(shù)組的指針變量不同之處在于,若指針變量p指向一維數(shù)組,則p+1表示一維數(shù)組下一個(gè)元素的地址,若指針變量p指向二維數(shù)組,則p+1表示二維數(shù)組下一行的首地址。當(dāng)然,若指針變量p不是第2行這么定義的,而是直接定義為int *p;p=a;這種情況下p+1表示下一個(gè)元素的地址。由第4行可以知道,a、*a輸出的都是一樣的地址值,但含義是不同的,a表示的是整個(gè)數(shù)組的首地址和第0行的首地址,但*a表示的是第0行第0列元素的地址。符號(hào)*具有“解地址”的功能,但由于是二維數(shù)組,解一次地址并不能取到某個(gè)元素的值,如果再解一次地址,例如**a就表示第0行第0列元素的值。由于是二維數(shù)組,a+1和p+1一樣都表示數(shù)組第1行的首地址。*(a+1)解一次地址,表示第1行第0列元素的地址,如果再解一次地址,則**(a+1)表示第1行第0列元素的值。*(a+1)+2表示行指針先定位到第1行第0列,表示地址,列指針再移動(dòng)2個(gè)元素的位置,即表示定位到第1行第2列,仍然為地址。如果再用一次*號(hào),則表示對(duì)應(yīng)的元素的值了。類似地,符號(hào)[ ]具有解地址的功能。例如第6行a[2]表示第2行第0個(gè)元素的地址(從0行開始),&a[2]表示對(duì)第2行取地址,即第2行首地址,&a[2][0]表示對(duì)a[2][0]這個(gè)元素取地址,3個(gè)地址都是一樣的,但含義不同。

      由第8行可知,定義了二維數(shù)組和相應(yīng)的行指針,要想取到數(shù)組元素的值,要么需要2個(gè)解地址符號(hào)*,要么需要1個(gè)*和1個(gè)[ ],要么需要2個(gè)[ ]。那么只有1個(gè)*或[ ]表示取到某個(gè)元素的地址,而1個(gè)*或[ ]都沒有,則表示某一行的首地址。而取地址符號(hào)“&”就像是“*”和“[ ]”相反效果的符號(hào)一樣。另外,由程序可知,指針變量名和數(shù)組名在很多情形下可以互相替換,效果一樣。

      三、總結(jié)

      C語(yǔ)言的精華在于指針,而指針又是比較難學(xué)的,初學(xué)者最不容易理解的就是它的地址與值的關(guān)系。本文通過(guò)兩個(gè)指針變量使用示例,將指針變量與數(shù)組中元素的地址和值作了詳細(xì)的闡釋,相關(guān)概念能幫助初學(xué)者熟練使用指針變量進(jìn)行數(shù)組元素遍歷。

      猜你喜歡
      數(shù)組指針字節(jié)
      JAVA稀疏矩陣算法
      No.8 字節(jié)跳動(dòng)將推出獨(dú)立出口電商APP
      JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
      No.10 “字節(jié)跳動(dòng)手機(jī)”要來(lái)了?
      偷指針的人
      為什么表的指針都按照順時(shí)針方向轉(zhuǎn)動(dòng)
      簡(jiǎn)談MC7字節(jié)碼
      尋找勾股數(shù)組的歷程
      基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
      ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
      崇明县| 淮北市| 迭部县| 永定县| 诸暨市| 吉林市| 聊城市| 长沙市| 安阳县| 维西| 滦平县| 宜兰县| 洪湖市| 华蓥市| 蕲春县| 剑河县| 琼中| 阜新市| 岳普湖县| 炉霍县| 新乡县| 惠东县| 沙湾县| 精河县| 资阳市| 宁晋县| 云南省| 通渭县| 黔南| 滦平县| 蕲春县| 彰化市| 阿拉善左旗| 华坪县| 利津县| 白水县| 新郑市| 阿鲁科尔沁旗| 格尔木市| 托里县| 峡江县|