色偷偷偷久久伊人大杳蕉,色爽交视频免费观看,欧美扒开腿做爽爽爽a片,欧美孕交alscan巨交xxx,日日碰狠狠躁久久躁蜜桃

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

發(fā)布時(shí)間:2016-2-18 14:14    發(fā)布者:designapp
關(guān)鍵詞: C語(yǔ)言 , 指針
  但凡人都是急功近利和有惰性的,我就是個(gè)例子。不想每篇博客都寫(xiě)一個(gè)摘要和那些大段的文字描述,但是為了讓一些新的讀者朋友了解我的博客內(nèi)容,我還是像前面說(shuō)的那樣,把第一篇關(guān)于指針的摘要搬過(guò)來(lái),因?yàn)槲覍?xiě)的這幾篇都是關(guān)于指針的,所以沒(méi)有必要每篇一個(gè)摘要,在此就偷偷懶了,如果讀過(guò)我前面兩篇C指針博客的朋友可以跳過(guò)這篇博客前面的摘要不讀,直接進(jìn)入主題部分。
  懂得C語(yǔ)言的人都知道,C語(yǔ)言之所以強(qiáng)大,以及其自由性,絕大部分體現(xiàn)在其靈活的指針運(yùn)用上。因此,說(shuō)指針是c語(yǔ)言的靈魂,一點(diǎn)都不為過(guò)。所以從我的標(biāo)題加了個(gè)(一)也可以看出指針的重要性,我盡可能的向大家交代清楚我對(duì)于指針的理解。所以在講解的過(guò)程中我盡可能的用代碼加文字的描述方式,通過(guò)代碼的分析來(lái)加深我們對(duì)于指針的理解,我給出的都是完整的代碼,所以讀者可以在看的過(guò)程中直接copy下去即可運(yùn)行,希望下面的講解能夠?qū)δ阌兴鶐椭?br />   在C語(yǔ)言中我們可以使用兩種方法來(lái)訪(fǎng)問(wèn)一個(gè)字符串。
  1、用字符數(shù)組存放一個(gè)字符串
  char str[ ]="this is str!!!";
  在此str是一個(gè)數(shù)組名,代表字符串?dāng)?shù)組的首地址。
  2、用字符指針指向一個(gè)字符串
  char *str="this is str,too";
  C語(yǔ)言對(duì)于字符串常量是按照字符數(shù)組的方式來(lái)進(jìn)行處理的,在內(nèi)存開(kāi)辟了一個(gè)字符數(shù)組來(lái)存放字符串常量。在此的str被定義為一個(gè)指針變量,指向字符型數(shù)組,它只能指向一個(gè)字符變量和其他的字符數(shù)據(jù)。輸出都是使用printf("%s",str);,在此過(guò)程中系統(tǒng)會(huì)先輸出一個(gè)str所指向的字符數(shù)據(jù),然后使用str加1的方法輸出下一個(gè)字符,知道遇到'\0'串結(jié)束符為止,在內(nèi)存中的字符串的最后都被自動(dòng)加上一個(gè)'\0'。
  字符串的傳遞可以使用傳址的方法,用字符數(shù)組的名字或者用指向字符數(shù)組的指針變量作為參數(shù)。在被調(diào)用的函數(shù)中可以改變字符串的內(nèi)容,主函數(shù)可以得到改變了的字符串。
  一、用字符數(shù)組作為參數(shù)
  接下來(lái)看看一個(gè)代碼:
  #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;
  }
  運(yùn)行結(jié)果為:
  


  僅僅從代碼實(shí)現(xiàn)的難易程度來(lái)看的話(huà)沒(méi)有什么難點(diǎn),但是可能有不少人可能會(huì)把我們代碼中用紅色標(biāo)志的代碼部分忘掉,從而出錯(cuò)。
  在此也給出我的另外一種實(shí)現(xiàn)方式:
  #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;
  }
  運(yùn)行結(jié)果為:
  


  值得注意的是這種實(shí)現(xiàn)方式的中的巧妙的利用了while語(yǔ)句while((to[i ]=from[i++])!='\0')。千萬(wàn)不要寫(xiě)成 while((to[i++]=from[i++])!='\0'),這樣的話(huà)每次執(zhí)行判斷語(yǔ)句是i++被執(zhí)行了兩次,導(dǎo)致最終的結(jié)果出錯(cuò)。
  二、用字符指針變量
  #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;
  }
  運(yùn)行結(jié)果為:
  


  在此我也給出一種結(jié)合逗號(hào)表達(dá)式和for循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn)的參考代碼:
  #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;
  }
  運(yùn)行結(jié)果為:
  


  代碼的巧妙之處在于結(jié)合了逗號(hào)表達(dá)式和for循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn),因?yàn)槎禾?hào)表達(dá)式的結(jié)果為最后一個(gè)表達(dá)式的結(jié)果,所以執(zhí)行判斷語(yǔ)句里邊的逗號(hào)表達(dá)式時(shí)其所取的值依然為*from!='\0'。
  有興趣的讀者自己可以嘗試下其他的實(shí)現(xiàn)方法,下面再給出幾種很巧妙的實(shí)現(xiàn)方法,有興趣的讀者可以自己研究下其實(shí)現(xiàn)原理,均為完整代碼。
  #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;
  }
  就不在此一一貼出運(yùn)行結(jié)果了,運(yùn)行結(jié)果同上,如果有興趣可以自己研究下以上代碼,同時(shí)還有很多的實(shí)現(xiàn)方法,希望以上代碼能夠啟發(fā)讀者的靈感寫(xiě)出更多的實(shí)現(xiàn)方法和更好的實(shí)現(xiàn)方案來(lái)。
                                
本文地址:http://m.54549.cn/thread-160870-1-1.html     【打印本頁(yè)】

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

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表