指標與字串

文章推薦指數: 80 %
投票人數:10人

在〈字元陣列與字串〉談過C 風格字串,本質上就是個字元陣列,而陣列名稱具有指標性質,那可以如下建立字串嗎? char *text = 回C語言目錄 在〈字元陣列與字串〉談過C風格字串,本質上就是個字元陣列,而陣列名稱具有指標性質,那可以如下建立字串嗎? char*text="hello"; gcc沒提出任何警訊,然而text儲存了字串常量的位址值,字串常量建立的內容是唯讀的,如果試圖透過text改變字元,會發生不可預期的結果: char*text="hello"; text[0]='H';//不可預期 因此對於字面常量,建議加上const: constchar*text="hello"; 如此一來,試圖透過text改變字元,編譯器會失敗,從而避免了執行時期的錯誤。

上述方式中,text只是個型態為constchar*的指標,是與以下不同的,底下建立的text內容並不是唯讀的,因為text是個陣列,text是將"hello"複製至各索引處: chartext[]="hello"; 對於wchar_t等其他為了支援Unicode的型態,都有這類特性。

然而,無論是哪個形式,都可以傳遞位址,例如: chartext1[]="hello"; constchar*text2="hello"; constchar*text=text1;//OK text=text2;//OK 不過,底下不行: chartext1[]="hello"; constchar*text2="hello"; char*text=text1;//OK text=text2;//error:invalidconversionfrom'constchar*'to'char*' 錯誤該行如果真的想通過編譯,就必須明確告訴編譯器,你要去除const修飾: chartext1[]="hello"; constchar*text2="hello"; char*text=text1;//OK text=(char*)text2;//強制去除const 會需要這麼做的情況,可能是在使用一些舊的函式,它們在參數上宣告的是char*,而不是constchar*。

那麼,如何建立字串陣列呢? #include intmain(void){ constchar*names[]={"Justin","Monica","Irene"}; for(inti=0;i<3;i++){ constchar*name=names[i]; printf("%s\n",name); } return0; } 留意一下底下的不同: constchar*names1[]={"Justin","Monica","Irene"}; charnames2[][10]={"Justin","Monica","Irene"}; name1的每個元素,儲存了各個字串常量的位址值;然而,name2是有三個長度為10的char陣列,並複製了各個字串常量的char。

可以透過typedef為constchar*建立別名,令字串陣列的建立易讀、易寫一些: #include typedefconstchar*String; intmain(void){ Stringnames[]={"Justin","Monica","Irene"}; for(inti=0;i<3;i++){ Stringname=names[i]; printf("%s\n",name); } return0; }



請為這篇文章評分?