對于初學者來說,C語言中對于字元串的操作稍顯複雜,而且夾雜着指針的操作,這使得程式員稍微一不小心就會出現錯誤。C語言作為低級語言和進階語言的中間題,必然比不上java中的String來的舒服。但是,C語言的優秀展現在它的效率和接近底層環境。好了,不多說了,大家先看下面這一道某IT公司的筆試題。
#include
#include
void main()
{
char * str1="abc";
char * str2="abc";
const char * str3="abc";
const char * str4="abc";
char str5[]="abc";
char str6[]="abc";
char * str7=(char *)malloc(sizeof(char)*4);
char * str8=(char *)malloc(sizeof(char)*4);
if(str1==str2)
printf("str1 equals to str2.\n");
else
printf("str1 does not equal to str2.\n");
if(str3==str4)
printf("str3 equals to str4.\n");
else
printf("str3 does not equal to str4.\n");
if(str5==str6)
printf("str5 equals to str6.\n");
else
printf("str5 does not equal to str6.\n");
if(str7==str8)
printf("str7 equals to str8.\n");
else
printf("str7 does not equal to str8.\n");
}
程式的運作結果如下圖所示:
我們先抛開這道題,回憶一下C語言定義字元串的幾種常見的方式:
①char * str="abc";
②char str[]="abc"; ,char str[4]="abc"; ,char str[4]={'a','b','c','\0'}
③char * str=(char *)malloc(sizeof(char)*4);
對于第一種方式,"abc"是常量字元串,是以它被存儲在常量區中,在程式被編譯後,str就直接指向常量區中的"abc"。再看第二種方式,str指向的記憶體空間是系統為其配置設定的棧空間,而且配置設定的時機并不是在程式編譯時,而是在程式運作時。是以,如果程式被編譯成目标檔案,第一種方式生成的目标檔案比第二種方式生成的目标檔案大。最後我們再來看第三種方式,顯然str指向的記憶體空間是在程式運作時由系統配置設定的堆空間。
我們再回到開始的那道試題,str1和str2均指向常量區中的"abc",是以str1等于str2,str3與str4相等也是同樣的道理。而str5,str6,str7和str8均指向不同的記憶體位址,故他們各不相等。