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

來源:互聯網
上載者:User

但凡人都是急功近利和有惰性的,我就是個例子。不想每篇部落格都寫一個摘要和那些大段的文字描述,但是為了讓一些新的讀者朋友瞭解我的部落格內容,我還是像前面說的那樣,把第一篇關於指標的摘要搬過來,因為我寫的這幾篇都是關於指標的,所以沒有必要每篇一個摘要,在此就偷偷懶了,如果讀過我前面兩篇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 <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;
}

運行結果為:

僅僅從代碼實現的難易程度來看的話沒有什麼痛點,但是可能有不少人可能會把我們代碼中用紅色標誌的代碼部分忘掉,從而出錯。

在此也給出我的另外一種實現方式:

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

運行結果為:

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

二、用字元指標變數

 

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

運行結果為:

在此我也給出一種結合逗號運算式和for迴圈語句來實現的參考代碼:

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

 

運行結果為:

代碼的巧妙之處在於結合了逗號運算式和for迴圈語句來實現,因為逗號運算式的結果為最後一個運算式的結果,所以執行判斷語句裡邊的逗號運算式時其所取的值依然為*from!='\0'。

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.