久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

char *與char []的區(qū)別

 昵稱13876790 2014-05-20

      其實(shí),,只要記住一點(diǎn)就能很好區(qū)分char *和char []:char *定義的是一個(gè)指向字符串的指針(注意:C語言中沒有對應(yīng)字符串的內(nèi)置類型或者類類型),,而char []就是C語言中的用來定義字符數(shù)組(注意:字符數(shù)組是不同于字符串,,如果字符數(shù)組以'/0'結(jié)尾,那么可以視為字符串),。
      分析如下


    (1)char str1[] = {'a', 'b', 'c'};//可以不用指定維數(shù),,如果這里指定就是char str1[3]
            char str2[] = {'a', 'b', 'c', '/0'};//可以不用指定維數(shù),如果這里指定就是char str2[4]


      顯然,,str2可以視為字符串(以'/0'結(jié)尾),,而str1不是字符串。


      如果用C函數(shù)庫中字符串處理函數(shù),,例如strlen函數(shù),,對于strlen(str1)則不能得到str1的正確長度,而strlen(str2)的返回值為3(不是維數(shù)4),。


 


   (2)char *str1 = “abc”;//默認(rèn)會在結(jié)尾加上'/0'
           char *str2 = “abc/0”;//顯式加上'/0',,跟上面其實(shí)一樣,沒有區(qū)別,,strlen求的長度都為3
           char *str3 = “abc/0defg”;//printf輸出會忽略'/0'后面的字符,,其實(shí)在編譯完時(shí),str3中就只有字符串a(chǎn)bc,,同樣strlen求的長度為3,。


 


   (3)char str[] = {“abcd”};//可以不用指定維數(shù),如果這里指定就是char str[5],,默認(rèn)會在結(jié)尾加上'/0'


    同char str[] = {'a', 'b', 'c', 'd', '/0'}一樣,。


    如果字符串里有/0這樣的字符,那么可以寫成char *str4 = “abc//0”;使用雙斜線,,轉(zhuǎn)義字符的寫法,。


 


      由上面可以知道,字符串可以是以'/0'結(jié)尾的字符數(shù)組,,也可以是字面常量字符串,,例如"abcdefg",把它的內(nèi)存地址賦給char *型的指針,。以上2種構(gòu)成的字符串,,即char []和char *在使用C語言庫函數(shù)時(shí),會有所不同,。


 


先簡要分析下面代碼


  1. #include <stdio.h>    
  2. #include <string.h>    
  3. int main(void)    
  4. {    
  5.     char str1[20] = "abc";    
  6.     char *str2 = "abc";    
  7.     printf("len1: %d/n", strlen(str1));    
  8.     printf("len2: %d/n", strlen(str2));    
  9.     strcat(str1, "def");    
  10.     strcat(str2, "def");    
  11.     return 0;    
  12. }  


     簡單調(diào)試一下,,就是知道第10行發(fā)生錯(cuò)誤,仔細(xì)想下str1指向了有20個(gè)字符空間的首地址,,而str2則指向字符串"abc"的首地址,,顯然使用strcat再添加字符串"def",則str2需要擴(kuò)充地址空間,,而這些地址空間沒有事先告訴程序,,當(dāng)然會出問題,。而str1事先分配了足夠的地址空間(可以放20個(gè)字符)。如果str1初始化時(shí)沒有分配足夠的大小,,那么第9行也會導(dǎo)致程序錯(cuò)誤,。


     也可以這樣理解,str2指向常量字符串,,是不能再寫入的,。而str1指向的是以'/0'結(jié)尾的字符數(shù)組,可以寫入,,只要數(shù)組足夠大,。


     如果char *型指針指向了字符數(shù)組,那么它和數(shù)組名都是指向同一塊內(nèi)存地址的指針,。代碼如下:


[c-sharp] view plaincopy
  1. #include <stdio.h>    
  2. #include <string.h>    
  3. int main(void)    
  4. {    
  5.     char str1[20] = "abc";    
  6.     char *str2 = "abc";    
  7.     str2 = str1;    
  8.     strcat(str2, "defg");    
  9.     printf("%s/n", str2);    
  10.     return 0;    
  11. }  


     這樣使用strcat(str2, “defg”);則沒有問題,。


     另外,char[]只能在初始化時(shí),,才能這樣賦值:char str1[20] = “abc”;如下


[c-sharp] view plaincopy
  1. #include <stdio.h>    
  2. #include <string.h>    
  3. int main(void)    
  4. {    
  5.     char str1[20] = "abc";    
  6.     char *str2 = "abc";    
  7.     //str1 = "defgh";    
  8.     //str1[20] = "defgh";    
  9.     //str1[20] = {'a', 'b', 'c', 'd', '/0'};    
  10.     //str1 = {'a', 'b', 'c', 'd', '/0'};    
  11.     str2 = "defgh";    
  12.     return 0;    
  13. }   


     注釋部分是str1不能再次以字符串的形式賦值(也不能以{'a', 'b', '/0'}形式賦值),,而str2則可以任意以字符串的形式再次賦值。


 


首次發(fā)文章,,希望能寫下去,!


    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多