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

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

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


  上面的圖片可能有點偏大。因為圖片看起來效果更好些,所以我還是把圖片傳上來的同時也把打印結果復制了一份如下,如果圖片因為網絡原因打不開就看下面的運行結果:
  ***************************用下標法打印a數組**************************
  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******************************
  ************************用數組名指針運算打印*************************
  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******************************
  ***************************打印二維數組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******************************
  *********************二維數組b的地址、以及pp和*ppp的值****************
  &b[0][0]=1244944 pp=1244944 *ppp=1244944
  ****************************end end end******************************
  *****************二維數組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
  首先來看看我們使用的三種打印一維數組a的方法,都成功的對a數組中的每個元素進行了打印,接下類是一個打印二維數組b的過程,在打印數組b中每個元素的同時我們也打印出了它相應的地址,細心的讀者可能發信地址間的規律,因為我們聲明的是int型,所以每個元素占用4個字節,相鄰元素間的地址之差為4。
  接下來我們使用了一個指針pp和一個指向指針的指針ppp,在使用指針的指針ppp的過程中要尤其注意它的使用。通過打印語句我們打印出了&b[0][0],pp,*ppp,其都具有相同的結果,都為二維數組b[0][0]的地址,所以接下來打印的b[0][0],*pp,**ppp均為b[0][0]的值,接下來我們采用指針的方法來成功的打印了二維數組b。
  在接下來我們打印出了指針pp、雙指針ppp的地址,同時也打印了ppp和*ppp的值,注意了*ppp的值和最后一次打印的數組元素的地址的關系,為什么會出現這樣的結果呢,因為我們前面使用了一句int **ppp=&pp;,使得*ppp和pp指向的是同一個存儲空間,其地址為&pp=1244932 ,所以在改變pp的值得時候,*ppp的值也在跟隨其改變。所以細心的讀者可能發現了在最后一句打印語句printf("%d\t",*(*ppp-1));中,我們使用了*(*ppp-1)才能成功的打印出二維數組b的最后一個最后一個元素。
  如何采用二維指針類打印數組呢,請看下面的代碼:
  #include
  int main()
  {
  //****************************打印二維數組b的值地址********************//
  printf("\n***************************打印二維數組b的值及地址*******************\n");
  int b[4][4];
  for(int n=0;n


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

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产不卡精品一区二区三区 | 日韩爆操| 国产一区 在线播放 | 日本天堂在线播放 | 欧美福利视频导航 | 久久久久久久99视频 | 最新黄色网址在线观看 | 亚洲成人av| 欧美精品成人一区二区在线观看 | 看黄漫的网站 | 国产女人18一级毛片视频 | 国产激情一级毛片久久久 | 老年人tv老年人同性 | 欧美高清一区二区 | 成人午夜免费视频 | 久久国产精品亚洲va麻豆 | 成人精品视频一区二区三区 | 欧美成人高清在线视频大全 | 欧美 日韩 亚洲另类专区 | 亚洲成人精品久久 | 成年黄色片 | 麻豆精品传媒视频观看 | 狠狠色狠狠色综合日日小蛇 | 久久6国产 | 888午夜不卡理论久久 | 欧美日本一道免费一区三区 | 色偷偷男人天堂 | 三级在线国产 | 精品视频一区二区三三区四区 | 老外一级毛片免费看 | 香蕉尹人在线观看免费下载 | 精品国产中文字幕 | 免费黄色欧美 | 国产岛国片 | 亚洲欧美日本一区 | 精品视频一区二区三区四区五区 | 欧美成人免费高清网站 | 四虎影剧院 | 精品黑人一区二区三区 | 国产精品福利在线观看免费不卡 | 国产精品一区二区三区四区 |