国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

C語言的那些小秘密之指針(二)

發(fā)布時(shí)間:2016-2-18 14:13    發(fā)布者:designapp
關(guān)鍵詞: C語言 , 指針
  懂得C語言的人都知道,C語言之所以強(qiáng)大,以及其自由性,絕大部分體現(xiàn)在其靈活的指針運(yùn)用上。因此,說指針是c語言的靈魂,一點(diǎn)都不為過。所以從我的標(biāo)題加了個(gè)(一)也可以看出指針的重要性,我盡可能的向大家交代清楚我對(duì)于指針的理解。所以在講解的過程中我盡可能的用代碼加文字的描述方式,通過代碼的分析來加深我們對(duì)于指針的理解,我給出的都是完整的代碼,所以讀者可以在看的過程中直接copy下去即可運(yùn)行,希望下面的講解能夠?qū)δ阌兴鶐椭?br />   在此也特地強(qiáng)調(diào)下,如果以后出現(xiàn)類似的情況時(shí),我博客的第一段均作為摘要。如果已經(jīng)在前面的博客中看過摘要的,那么重復(fù)的摘要部分可跳過不讀,直接進(jìn)入正文。
  接著上一篇的指針部分,我們接下來看看數(shù)組的指針和指向數(shù)組的指針變量。數(shù)組的指針就是數(shù)組的起始地址,數(shù)組元素的指針是數(shù)組元素的地址。對(duì)于一個(gè)數(shù)組元素的引用我們通常可以使用兩種方法:
  1、下標(biāo)法,如a[8]。
  2、指針法。
  其中使用指針法的優(yōu)點(diǎn)是使得目標(biāo)程序占內(nèi)存少、運(yùn)行速度快,從而使得其質(zhì)量更高。為什么說指針具有這樣的優(yōu)點(diǎn)呢,我想還是有必要在此給出點(diǎn)我解釋,因?yàn)橹羔樤?2位機(jī)器下占用4個(gè)字節(jié),如果函數(shù)傳輸一個(gè)占用內(nèi)存很大的對(duì)象例如:int a[2000],顯然用指針引用傳送簡(jiǎn)單,節(jié)省了內(nèi)存,也節(jié)省了用于復(fù)制對(duì)象的時(shí)間;如果我們用下標(biāo)法來引用數(shù)組,還得去取數(shù)組的起始地址,通過base + offset再轉(zhuǎn)換為直接尋址,比指針多了操作。
  從以上可以看出,指針能力很強(qiáng),能完成許多事情,C的精髓就在于指針,使得C能接近ASM的效率。所以我們?cè)趯懢帉懗绦虻臅r(shí)候有必要充分利用指針的優(yōu)點(diǎn),編寫出高效的C語言代碼。
  下面來看看一個(gè)代碼:
  #include
  #include
  int main()
  {
  int a[8];
  int *p;
  //***************************用下標(biāo)法打印a數(shù)組**************************//
  printf("\n***************************用下標(biāo)法打印a數(shù)組**************************\n");
  for(int i=0;i


  上面的圖片可能有點(diǎn)偏大。因?yàn)閳D片看起來效果更好些,所以我還是把圖片傳上來的同時(shí)也把打印結(jié)果復(fù)制了一份如下,如果圖片因?yàn)榫W(wǎng)絡(luò)原因打不開就看下面的運(yùn)行結(jié)果:
  ***************************用下標(biāo)法打印a數(shù)組**************************
  a[0]=0 a[1]=1 a[2]=2 a[3]=3 a[4]=4 a[5]=5 a[6]=6 a[7]=7
  ****************************end end end******************************
  ***************************使用指針變量打印**************************
  p0=0 p1=1 p2=2 p3=3 p4=4 p5=5 p6=6 p7=7
  ****************************end end end******************************
  ************************用數(shù)組名指針運(yùn)算打印*************************
  a[0]=0 a[1]=1 a[2]=2 a[3]=3 a[4]=4 a[5]=5 a[6]=6 a[7]=7
  ****************************end end end******************************
  ***************************打印二維數(shù)組b的值及地址*******************
  0 1244944 0 1244948 0 1244952 0 1244956
  0 1244960 1 1244964 2 1244968 3 1244972
  0 1244976 2 1244980 4 1244984 6 1244988
  0 1244992 3 1244996 6 1245000 9 1245004
  ****************************end end end******************************
  *********************二維數(shù)組b的地址、以及pp和*ppp的值****************
  &b[0][0]=1244944 pp=1244944 *ppp=1244944
  ****************************end end end******************************
  *****************二維數(shù)組b[0][0]、以及*pp和**ppp的值******************
  b[0][0]=0 *pp=0 **ppp=0
  ****************************end end end******************************
  ***************************使用指針變量打印**************************
  0 0 0 0 0 1 2 3 0 2
  4 6 0 3 6 9
  ****************************end end end******************************
  &pp=1244932 &ppp=1244928
  ppp=1244932 *ppp=1245008
  9 Press any key to continue
  首先來看看我們使用的三種打印一維數(shù)組a的方法,都成功的對(duì)a數(shù)組中的每個(gè)元素進(jìn)行了打印,接下類是一個(gè)打印二維數(shù)組b的過程,在打印數(shù)組b中每個(gè)元素的同時(shí)我們也打印出了它相應(yīng)的地址,細(xì)心的讀者可能發(fā)信地址間的規(guī)律,因?yàn)槲覀兟暶鞯氖莍nt型,所以每個(gè)元素占用4個(gè)字節(jié),相鄰元素間的地址之差為4。
  接下來我們使用了一個(gè)指針pp和一個(gè)指向指針的指針ppp,在使用指針的指針ppp的過程中要尤其注意它的使用。通過打印語句我們打印出了&b[0][0],pp,*ppp,其都具有相同的結(jié)果,都為二維數(shù)組b[0][0]的地址,所以接下來打印的b[0][0],*pp,**ppp均為b[0][0]的值,接下來我們采用指針的方法來成功的打印了二維數(shù)組b。
  在接下來我們打印出了指針pp、雙指針ppp的地址,同時(shí)也打印了ppp和*ppp的值,注意了*ppp的值和最后一次打印的數(shù)組元素的地址的關(guān)系,為什么會(huì)出現(xiàn)這樣的結(jié)果呢,因?yàn)槲覀兦懊媸褂昧艘痪鋓nt **ppp=&pp;,使得*ppp和pp指向的是同一個(gè)存儲(chǔ)空間,其地址為&pp=1244932 ,所以在改變pp的值得時(shí)候,*ppp的值也在跟隨其改變。所以細(xì)心的讀者可能發(fā)現(xiàn)了在最后一句打印語句printf("%d\t",*(*ppp-1));中,我們使用了*(*ppp-1)才能成功的打印出二維數(shù)組b的最后一個(gè)最后一個(gè)元素。
  如何采用二維指針類打印數(shù)組呢,請(qǐng)看下面的代碼:
  #include
  int main()
  {
  //****************************打印二維數(shù)組b的值地址********************//
  printf("\n***************************打印二維數(shù)組b的值及地址*******************\n");
  int b[4][4];
  for(int n=0;n


  注意代碼中我們的紅色標(biāo)記部分,很多人在采用二維指針**ppp進(jìn)行打印的時(shí)候最容易出錯(cuò)的地方,很多人使用的是如下方式:
  for(*ppp;*ppp<(&b[0][0]+16);*ppp++)
  看似沒有問題,似乎能得到正確的結(jié)果,但是我們仔細(xì)分析就會(huì)發(fā)現(xiàn)其中的問題所在,因?yàn)?+的優(yōu)先級(jí)高于*,所以首先進(jìn)行的是ppp++運(yùn)算,然后才是*ppp,這樣的話就出現(xiàn)我們前面所講的野指針的問題了。所以在調(diào)用printf("%d\t",**ppp);就會(huì)出現(xiàn)內(nèi)存錯(cuò)誤。所以在此我們需要加上一個(gè)括號(hào)(*ppp)++,這樣*ppp中的才是b[0][0]的地址,接下來通過使用++操作和printf("%d\t",**ppp);才能成功的打印出二維數(shù)組b的元素。
                               
               
本文地址:http://www.qingdxww.cn/thread-160867-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 無線充電基礎(chǔ)知識(shí)及應(yīng)用培訓(xùn)教程2
  • 基于CEC1712實(shí)現(xiàn)的處理器SPI FLASH固件安全彈性方案培訓(xùn)教程
  • 安靜高效的電機(jī)控制——這才是正確的方向!
  • 了解一下Microchip強(qiáng)大的PIC18-Q24 MCU系列
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线观看一区二区不卡视频 | 色婷婷激情五月 | 国产成人欧美一区二区三区vr | 久久精品国产99国产精品 | 精品一区二区久久 | 久久福利资源站免费观看i 久久福利资源网站免费看 久久福利影院 | 久久六| 成人精品视频一区二区三区 | 99re免费视频精品全部 | 国产成人a一在线观看 | 免费国产高清精品一区在线 | 日韩aⅴ在线观看 | 国产最新自拍 | 黄工厂精品视频在线观看 | 亚洲男人影院 | 免费人成在观看 | 美国一级毛片不卡无毒 | 成年女人毛片免费观看中文w | 久久久久国产一级毛片高清板 | 国产丰满眼镜女在线观看 | 2019天天干天天操 | 91国内外精品自在线播放 | 五月天婷婷免费观看视频在线 | 久久99国产一区二区三区 | 两个人在线观看完整 | 四虎影院一级片 | 久久精品国产99精品最新 | 东方四虎 | 国产极品白嫩美女在线观看看 | 成人网址在线观看 | 和阿同居的日子hd | 国产成人污污网站在线观看 | 亚洲女同视频 | 亚洲一区中文字幕 | 男人和女人真曰批全过程 | 日本最新新片在线观看免费 | 国内精品91最新在线观看 | 日本无遮挡吸乳视频看看 | 免费在线观看a | 青青青草国产线观 | 12一15女人a毛片 |