<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

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

    發布時間:2016-2-18 14:14    發布者:designapp
    關鍵詞: C語言 , 指針
      但凡人都是急功近利和有惰性的,我就是個例子。不想每篇博客都寫一個摘要和那些大段的文字描述,但是為了讓一些新的讀者朋友了解我的博客內容,我還是像前面說的那樣,把第一篇關于指針的摘要搬過來,因為我寫的這幾篇都是關于指針的,所以沒有必要每篇一個摘要,在此就偷偷懶了,如果讀過我前面兩篇C指針博客的朋友可以跳過這篇博客前面的摘要不讀,直接進入主題部分。
      懂得C語言的人都知道,C語言之所以強大,以及其自由性,絕大部分體現在其靈活的指針運用上。因此,說指針是c語言的靈魂,一點都不為過。所以從我的標題加了個(一)也可以看出指針的重要性,我盡可能的向大家交代清楚我對于指針的理解。所以在講解的過程中我盡可能的用代碼加文字的描述方式,通過代碼的分析來加深我們對于指針的理解,我給出的都是完整的代碼,所以讀者可以在看的過程中直接copy下去即可運行,希望下面的講解能夠對你有所幫助。
      在C語言中我們可以使用兩種方法來訪問一個字符串。
      1、用字符數組存放一個字符串
      char str[ ]="this is str!!!";
      在此str是一個數組名,代表字符串數組的首地址。
      2、用字符指針指向一個字符串
      char *str="this is str,too";
      C語言對于字符串常量是按照字符數組的方式來進行處理的,在內存開辟了一個字符數組來存放字符串常量。在此的str被定義為一個指針變量,指向字符型數組,它只能指向一個字符變量和其他的字符數據。輸出都是使用printf("%s",str);,在此過程中系統會先輸出一個str所指向的字符數據,然后使用str加1的方法輸出下一個字符,知道遇到'\0'串結束符為止,在內存中的字符串的最后都被自動加上一個'\0'。
      字符串的傳遞可以使用傳址的方法,用字符數組的名字或者用指向字符數組的指針變量作為參數。在被調用的函數中可以改變字符串的內容,主函數可以得到改變了的字符串。
      一、用字符數組作為參數
      接下來看看一個代碼:
      #include
      void copy_string(char from[],char to[])
      {
      int i=0;
      while(from[i ]!='\0'){
      (to[i ]=from[i ]);
      i++;
      }
      to[i ]='\0';
      return ;
      }
      int main()
      {
      char str[]="this is a string!";
      printf("%s\n",str);
      char dec_str[206];
      copy_string(str,dec_str);
      printf("%s\n",dec_str);
      return 0;
      }
      運行結果為:
      


      僅僅從代碼實現的難易程度來看的話沒有什么難點,但是可能有不少人可能會把我們代碼中用紅色標志的代碼部分忘掉,從而出錯。
      在此也給出我的另外一種實現方式:
      #include
      void copy_string(char from[],char to[])
      {
      int i=0;
      while((to[i ]=from[i++])!='\0'){
      ;
      }
      return ;
      }
      int main()
      {
      char str[]="this is a string!";
      printf("%s\n",str);
      char dec_str[206];
      copy_string(str,dec_str);
      printf("%s\n",dec_str);
      return 0;
      }
      運行結果為:
      


      值得注意的是這種實現方式的中的巧妙的利用了while語句while((to[i ]=from[i++])!='\0')。千萬不要寫成 while((to[i++]=from[i++])!='\0'),這樣的話每次執行判斷語句是i++被執行了兩次,導致最終的結果出錯。
      二、用字符指針變量
      #include
      void copy_string(char *from,char *to)
      {
      int i=0;
      while(*from!='\0')
      *to++=*from++;
      *to='\0';
      return ;
      }
      int main()
      {
      char str[]="this is a string!";
      printf("%s\n",str);
      char dec_str[206];
      copy_string(str,dec_str);
      printf("%s\n",dec_str);
      return 0;
      }
      運行結果為:
      


      在此我也給出一種結合逗號表達式和for循環語句來實現的參考代碼:
      #include
      void copy_string(char *from,char *to)
      {
      int i=0;
      for(;*to=*from,*from!='\0';from++,to++);
      return ;
      }
      int main()
      {
      char str[]="this is a string!";
      printf("%s\n",str);
      char dec_str[206];
      copy_string(str,dec_str);
      printf("%s\n",dec_str);
      return 0;
      }
      運行結果為:
      


      代碼的巧妙之處在于結合了逗號表達式和for循環語句來實現,因為逗號表達式的結果為最后一個表達式的結果,所以執行判斷語句里邊的逗號表達式時其所取的值依然為*from!='\0'。
      有興趣的讀者自己可以嘗試下其他的實現方法,下面再給出幾種很巧妙的實現方法,有興趣的讀者可以自己研究下其實現原理,均為完整代碼。
      #include
      void copy_string(char *from,char *to)
      {
      int i=0;
      for(;*to++=*from++;);
      return ;
      }
      int main()
      {
      char str[]="this is a string!";
      printf("%s\n",str);
      char dec_str[206];
      copy_string(str,dec_str);
      printf("%s\n",dec_str);
      return 0;
      }
      #include
      void copy_string(char *from,char *to)
      {
      int i=0;
      while(*to++=*from++);
      return ;
      }
      int main()
      {
      char str[]="this is a string!";
      printf("%s\n",str);
      char dec_str[206];
      copy_string(str,dec_str);
      printf("%s\n",dec_str);
      return 0;
      }
      #include
      void copy_string(char *from,char *to)
      {
      int i=0;
      while((*to++=*from++)!='\0');
      return ;
      }
      int main()
      {
      char str[]="this is a string!";
      printf("%s\n",str);
      char dec_str[206];
      copy_string(str,dec_str);
      printf("%s\n",dec_str);
      return 0;
      }
      #include
      void copy_string(char *from,char *to)
      {
      char*p1,*p2;
      p1=from;
      p2=to;
      while((*p2++=*p1++)!='\0');
      return ;
      }
      int main()
      {
      char str[]="this is a string!";
      printf("%s\n",str);
      char dec_str[206];
      copy_string(str,dec_str);
      printf("%s\n",dec_str);
      return 0;
      }
      #include
      void copy_string(char from[],char to[])
      {
      char*p1,*p2;
      p1=from;
      p2=to;
      while((*p2++=*p1++)!='\0');
      return ;
      }
      int main()
      {
      char str[]="this is a string!";
      printf("%s\n",str);
      char dec_str[206];
      copy_string(str,dec_str);
      printf("%s\n",dec_str);
      return 0;
      }
      就不在此一一貼出運行結果了,運行結果同上,如果有興趣可以自己研究下以上代碼,同時還有很多的實現方法,希望以上代碼能夠啟發讀者的靈感寫出更多的實現方法和更好的實現方案來。
                                    
    本文地址:http://www.portaltwn.com/thread-160870-1-1.html     【打印本頁】

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

    廠商推薦

    • Microchip視頻專區
    • 利用模擬開發工具生態系統進行安全電路設計
    • 我們是Microchip
    • Cortex-M4外設 —— TC&TCC結合事件系統&DMA優化任務培訓教程
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區
    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷