在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

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

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

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

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

              先讓我們來看看一段非常熟悉的代碼:

              #include

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

              {

              while(argc-->1)

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

              }

              運行結果如下:

              

             

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

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

              #include

              void main()

              {

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

              *++argv;

              }

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

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

              看了上面的代碼,接下來我們看看指針數(shù)組和數(shù)組指針的區(qū)別所在。

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

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

              接下來看看一段代碼:

              #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");

              }

              運行結果如下:

              

             

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

              對以上的代碼稍加修改:

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

              下面再來看看一段代碼:

              #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函數(shù)中我們使用了兩句 printf("%dn",ss);和 printf("%dn",&ss);來打印數(shù)組ss的地址,值得注意的就是數(shù)組的首地址的幾種表示方法,還可以是&ss[0];在調(diào)用ss函數(shù)的過程中,我們使用的是數(shù)組作為參數(shù),同時為了加深讀者對于數(shù)組作為參數(shù)的時候可以使用++這樣的操作符印象,我在此使用s++的方法打印了整個數(shù)組。細心的讀者會發(fā)現(xiàn)我使用的 printf("%dn",s);和 printf("%dn",&s);在此打印的結果不再一樣了,跟在main函數(shù)中用這樣的語句打印數(shù)組首地址的結果一致不符合,這也從側面說明了當數(shù)組名作為參數(shù)的時候,系統(tǒng)是將它作為變量處理的,所以打印的結果不一致。

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

            c語言相關文章:c語言教程




            關鍵詞: C語言 指針

            評論


            相關推薦

            技術專區(qū)

            關閉