<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > C語(yǔ)言的那些小秘密之指針(四)

C語(yǔ)言的那些小秘密之指針(四)

作者: 時(shí)間:2015-04-04 來(lái)源:電子產(chǎn)品世界 收藏

  正如前一篇博客所說(shuō)的,但凡人都是急功近利和有惰性的,都不喜歡花時(shí)間去閱讀那些我們認為枯燥的文字描述,喜歡直接進(jìn)入主題。但是有時(shí)候恰恰就是因為我們的這種急功近利和惰性,使得我們繞了很大一個(gè)彎,到最后還是回到了文字描述上來(lái),所以我覺(jué)得適當的文字描述下,讓讀者對于文章的整體有個(gè)大概的認識之后,再去學(xué)習能收獲更好的效果。我的前兩篇關(guān)于C的博客用的摘要都是copy我第一篇C博客的摘要,當然這篇也不例外,還是會(huì )引用我第一篇博客的摘要,只是在引用摘要之前我要先交代件事兒,就是關(guān)于函數和指針函數、以及指針常量和常量指針我就不在此講解了,有興趣的朋友可以參考我之前寫(xiě)的兩篇博客---的那些小秘密之函數指針和的那些小秘密之const修飾符。

本文引用地址:http://dyxdggzs.com/article/272069.htm

  懂得的人都知道,C語(yǔ)言之所以強大,以及其自由性,絕大部分體現在其靈活的指針運用上。因此,說(shuō)指針是c語(yǔ)言的靈魂,一點(diǎn)都不為過(guò)。所以從我的標題加了個(gè)(一)也可以看出指針的重要性,我盡可能的向大家交代清楚我對于指針的理解。所以在講解的過(guò)程中我盡可能的用代碼加文字的描述方式,通過(guò)代碼的分析來(lái)加深我們對于指針的理解,我給出的都是完整的代碼,所以讀者可以在看的過(guò)程中直接copy下去即可運行,希望下面的講解能夠對你有所幫助。

  先讓我們來(lái)看看一段非常熟悉的代碼:

  #include

  void main(int argc,char *argv[])

  {

  while(argc-->1)

  printf("%st",*++argv);

  }

  運行結果如下:

  

 

  可能還是有人不是很了解main函數里的參數argc和argv是什么意思,在此做一簡(jiǎn)單的講解,argc為命令行輸入的參數個(gè)數,在此argc=3,有三個(gè)參數,分別是:fdsa.exe fdsa asdf,argv是一個(gè)指針數組,在此相當于char *argv[0]="fdsa.exe"、char *argv[1]="fdsa"、char *argv[0]="asdf"。有了上面的解釋相信能夠很好的理解main函數的參數了。

  現在來(lái)分析下上面的代碼,程序中有一句argv++;但是我們上面的分析是argv是一個(gè)數組名,而數組名是不能進(jìn)行這樣的++運算的,難道出錯了嘛?!但是明明運行結果已經(jīng)就在眼前了,在解釋之前我們再來(lái)看如下一段代碼:

  #include

  void main()

  {

  char *argv[]={"this","is","shuzu"};

  *++argv;

  }

  編譯發(fā)現出錯了。

  好了現在我們可以來(lái)解釋為什么會(huì )出現如上兩種情況了,有種特殊情況就是數組名作為函數參數,傳遞的是數組的首地址,系統會(huì )把形參當作變量來(lái)處理,所以如果我們吧main函數改寫(xiě)為main(int argc,char **argv);就好理解多了。

  看了上面的代碼,接下來(lái)我們看看指針數組和數組指針的區別所在。

  一、指針數組指的是一個(gè)數組,數組中的每個(gè)元素都是指針類(lèi)型,所有的指針都指向不同的地址,所指的地址的數據也不一定一樣,但是所指的數據類(lèi)型必須一樣。

  二、數組指針指的是定義的是一個(gè)指針,而指針指向的是數組,指針指向數組首單元的地址,對于數組內部元素的屬性不了解,僅僅是規定了數組首單元的地址,通過(guò)它可以找到整個(gè)數組。

  接下來(lái)看看一段代碼:

  #include

  void main()

  {

  int *p=new int [10];

  int arr[10];

  int (*ptr)[10];

  for(int i=0;i<9;i++)

  {

  arr[i]=i;

  printf("a[%d]=%dt%dt",i,arr[i],&arr[i]);

  }

  printf("n");

  int j=0;

  ptr=&arr;

  printf("nptr=%dt&arr=%dt&arr[0]=%dn",ptr,&arr,&arr[0]);

  printf("n");

  for(;j<9;j++)

  {

  printf("ptr%d=%dt%dt",j,*((*ptr)+j),&(*ptr)[j]);

  }

  printf("n");

  }

  運行結果如下:

  

 

  在程序中我們打印了數組a中每個(gè)數組元素的值和其相應的地址,同時(shí)也定義了一個(gè)數組指針,int (*ptr)[10]; ,在引用數組指針的過(guò)程中必須要注意的是數組指針的維數必須要引用的數組維數相同,否從會(huì )出錯。我們可以把int (*ptr)[10]; 拆開(kāi)來(lái)看,把指針ptr看成是指向int [10];的類(lèi)型,把int [10]視為一種新的類(lèi)型,所以在使用指針ptr的時(shí)候類(lèi)型必須要一致,即必須是一個(gè)int [10]這樣的數組。

  對以上的代碼稍加修改:

  #include

  void main()

  {

  int arr[4][4];

  int (*ptr)[4];

  for(int i=0;i<4;i++)

  {

  for(int j=0;j<4;j++)

  {

  arr[i][j]=i*j;

  printf("a[%d]=%dt%dt",i,arr[i][j],&arr[i][j]);

  }

  printf("n");

  }

  printf("n");

  int j=0;

  ptr=arr;

  printf("nptr=%dt&arr=%dt&arr[0]=%dt&arr[0][0]=%dn",ptr,&arr,&arr[0],&arr[0][0]);

  printf("n");

  for(;j<16;j++)

  {

  if(j%4==0&&j!=0)

  printf("n");

  printf("ptr%d=%dt%dt",j,*((*ptr)+j),&(*ptr)[j]);

  }

  printf("n");

  }

  運行結果如下:

  

 

  可能有的讀者看了int arr[4][4];int (*ptr)[4]; 這兩句代碼之后認為接下來(lái)的代碼ptr=arr;有錯,因為arr是一個(gè)二位數組,而ptr只是一個(gè)指向int [4]類(lèi)型的指針。但是要注意了,從運行結果我們也可以肯定的是上面的代碼是正確的,但是為什么是正確的呢?!首先我們把arr分為兩部分來(lái)看,第一部分為int [4],第二部分為arr[4],這樣就一目了然了,我們可以認為我們定義了一個(gè)一維數組arr[4],數組有四個(gè)元素,每個(gè)元素的類(lèi)型為int [4],因此和一般的數組一樣,我們可以將該數組名賦給指針,其實(shí)也就是第一個(gè)元素的地址付給指針。即: ptr=arr;或者ptr=&arr[0]。其余情況以此類(lèi)推。

  下面再來(lái)看看一段代碼:

  #include

  void sum(int s[])

  {

  int i;

  printf("%dn",s);

  printf("%dn",*(s+3));

  printf("%dn",&s);

  printf("%dn",*s++);

  printf("%dn",*s++);

  printf("%dn",*s++);

  printf("%dn",*s);

  printf("n");

  }

  void main(int argc,char *argv[])

  {

  int ss[4];

  for(int i=0;i<4;i++)

  ss[i]=i;

  sum(ss);

  printf("%dn",ss);

  printf("%dn",&ss);

  }

  運行結果如下:

  

 

  在main函數中我們使用了兩句 printf("%dn",ss);和 printf("%dn",&ss);來(lái)打印數組ss的地址,值得注意的就是數組的首地址的幾種表示方法,還可以是&ss[0];在調用ss函數的過(guò)程中,我們使用的是數組作為參數,同時(shí)為了加深讀者對于數組作為參數的時(shí)候可以使用++這樣的操作符印象,我在此使用s++的方法打印了整個(gè)數組。細心的讀者會(huì )發(fā)現我使用的 printf("%dn",s);和 printf("%dn",&s);在此打印的結果不再一樣了,跟在main函數中用這樣的語(yǔ)句打印數組首地址的結果一致不符合,這也從側面說(shuō)明了當數組名作為參數的時(shí)候,系統是將它作為變量處理的,所以打印的結果不一致。

  指針的講解到此就告一段落了,由于本人水平有限,博客中的不妥或錯誤之處在所難免,殷切希望讀者批評指正。同時(shí)也歡迎讀者共同探討相關(guān)的內容,如果樂(lè )意交流的話(huà)請留下你寶貴的意見(jiàn)。

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程




關(guān)鍵詞: C語(yǔ)言 指針

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>