国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

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

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

分類: 【C語言的那些小秘密】 356人閱讀 評論(0) 收藏 舉報

但凡人都是急功近利和有惰性的,我就是個例子。不想每篇博客都寫一個摘要和那些大段的文字描述,但是為了讓一些新的讀者朋友了解我的博客內(nèi)容,我還是像前面說的那樣,把第一篇關(guān)于指針的摘要搬過來,因為我寫的這幾篇都是關(guān)于指針的,所以沒有必要每篇一個摘要,在此就偷偷懶了,如果讀過我前面兩篇C指針博客的朋友可以跳過這篇博客前面的摘要不讀,直接進(jìn)入主題部分。

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

在C語言中我們可以使用兩種方法來訪問一個字符串。

1、用字符數(shù)組存放一個字符串

char str[ ]="this is str!!!";

在此str是一個數(shù)組名,代表字符串?dāng)?shù)組的首地址。

2、用字符指針指向一個字符串

char *str="this is str,too";

C語言對于字符串常量是按照字符數(shù)組的方式來進(jìn)行處理的,在內(nèi)存開辟了一個字符數(shù)組來存放字符串常量。在此的str被定義為一個指針變量,指向字符型數(shù)組,它只能指向一個字符變量和其他的字符數(shù)據(jù)。輸出都是使用printf("%s",str);,在此過程中系統(tǒng)會先輸出一個str所指向的字符數(shù)據(jù),然后使用str加1的方法輸出下一個字符,知道遇到'\0'串結(jié)束符為止,在內(nèi)存中的字符串的最后都被自動加上一個'\0'。

字符串的傳遞可以使用傳址的方法,用字符數(shù)組的名字或者用指向字符數(shù)組的指針變量作為參數(shù)。在被調(diào)用的函數(shù)中可以改變字符串的內(nèi)容,主函數(shù)可以得到改變了的字符串。

一、用字符數(shù)組作為參數(shù)

接下來看看一個代碼:

#include <stdio.h>

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;
}

運行結(jié)果為:

僅僅從代碼實現(xiàn)的難易程度來看的話沒有什么難點,但是可能有不少人可能會把我們代碼中用紅色標(biāo)志的代碼部分忘掉,從而出錯。

在此也給出我的另外一種實現(xiàn)方式:

#include <stdio.h>

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;
}

運行結(jié)果為:

值得注意的是這種實現(xiàn)方式的中的巧妙的利用了while語句while((to[i]=from[i++])!='\0')。千萬不要寫成 while((to[i++]=from[i++])!='\0'),這樣的話每次執(zhí)行判斷語句是i++被執(zhí)行了兩次,導(dǎo)致最終的結(jié)果出錯。

二、用字符指針變量

 

#include <stdio.h>

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;
}

運行結(jié)果為:

在此我也給出一種結(jié)合逗號表達(dá)式和for循環(huán)語句來實現(xiàn)的參考代碼:

#include <stdio.h>

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;
}

 

運行結(jié)果為:

代碼的巧妙之處在于結(jié)合了逗號表達(dá)式和for循環(huán)語句來實現(xiàn),因為逗號表達(dá)式的結(jié)果為最后一個表達(dá)式的結(jié)果,所以執(zhí)行判斷語句里邊的逗號表達(dá)式時其所取的值依然為*from!='\0'。

有興趣的讀者自己可以嘗試下其他的實現(xiàn)方法,下面再給出幾種很巧妙的實現(xiàn)方法,有興趣的讀者可以自己研究下其實現(xiàn)原理,均為完整代碼。

#include <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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;
}

就不在此一一貼出運行結(jié)果了,運行結(jié)果同上,如果有興趣可以自己研究下以上代碼,同時還有很多的實現(xiàn)方法,希望以上代碼能夠啟發(fā)讀者的靈感寫出更多的實現(xiàn)方法和更好的實現(xiàn)方案來。

分享到:
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C標(biāo)準(zhǔn)庫
函數(shù)的返回類型為指針類型時的若干思考(字符串常量問題)
全排列
字符串函數(shù)
c 中 char 與 string 之間的相互轉(zhuǎn)換問題
C語言字符串函數(shù)大全
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服