通常我們爲字符串與字符數組的使用的差異而煩惱,因爲一些細小的差別會帶來一些莫名其妙的煩惱。
好了,下面就開始談談吧,直接進入要點吧,那些基本的就不說了,比如什麼末尾'/0'字符,訪問越界等一些問題就不必討論了,學過的C的人都知道怎麼會事情。
定義一個字符串的方法:
char *string="xxxxxx";
定義一個字符數組的方法:
char string[]="xxxxxx";
看看下面代碼:
void test(char *string)
{
if(string!=NULL)
*string='a';
}
int mian(void)
{
char a[]="abcd";
char *b="abcd";
char *c=NULL;
test(a);//操作合法
test(b);//操作不合法
}
這裏發現操作test(b)的時候出錯了,其實這裏有需要注意的地方,定義一個字符串的時候,通常分配地址是在代碼段,字符串有const屬性,但是它的指針不具有const屬性,所以我們仍然可以讓這個指針指向其它地址空間。所以test(b)就不合法了。而字符數組則和普通變量差不多,但是數組名有兩重含義,其中一種就是代表字符串的首地址,但是這個地址是個常量,就指向的地址空間不變,指向的內容可變,爲了改變其指針屬性,可以把這樣改變b=a;這樣b的地址和指向的內容均可變了。如果c=b,則c相對b的屬性沒有任何改變。
再看看下面一個例子:
char* test()
{
char a[]="sssssssss";
char *b="sssssssss";
char *c=a;
return a;
//return b;
//return c;
}
int mian(void)
{
char *c=NULL;
c= test();
puts(c);
}
同樣都是返回了一個字符串的地址,測試發現 return a和return c的時候有問題,return b卻沒有問題,這個說明了什麼問題呢?呵呵好好體會吧!定義一個字符串有它的特殊屬性的。