C語(yǔ)言中,字符數(shù)組和字符串指針都可以用來(lái)存儲(chǔ)字符串:
char *pstr = "china";
char str[] = "china";
但兩者在內(nèi)存中的存儲(chǔ)區(qū)域是不一樣的:
- 字符指針的字符串存儲(chǔ)在常量區(qū);
- 而字符數(shù)組則存儲(chǔ)在棧區(qū)。
如下圖所示,字符指針pstr指向字符串"china"常量的首地址,字符數(shù)組str指向的是在棧區(qū)的地址。

棧區(qū)的字符串(也包括其他數(shù)據(jù))有讀取和寫入的權(quán)限,而常量區(qū)的字符串(也包括其他數(shù)據(jù))只有讀取權(quán)限,沒有寫入權(quán)限。因此,帶來(lái)兩方面的區(qū)別。
1、指向內(nèi)容的可變性
字符串一旦被創(chuàng)建就存在于常量池中。
char *pstr = "china";
這是對(duì)字符指針進(jìn)行初始化,此時(shí)字符指針指向一個(gè)字符串常量的首地址,常量是不能改變的。
char str[] = "china";
這是以字符數(shù)組形式創(chuàng)建的字符串,實(shí)際上是從字符串常量池中復(fù)制了一個(gè)副本,所以修改字符數(shù)組的內(nèi)容時(shí),只是修改的自己的副本,并不會(huì)影響到常量池中的字符串。
下面代碼直接修改 pstr[0] 的值是錯(cuò)誤的(能夠正常編譯和鏈接,但在運(yùn)行時(shí)會(huì)出現(xiàn)段錯(cuò)誤(Segment Fault)或者寫入位置錯(cuò)誤);而修改 str[0] 的值則是可以的。

2、值的可變性
pstr 和 str 都是指針,但 pstr 是個(gè)變量,它的值是可以改變的,比如可以指向另一個(gè)字符串;而 str 指向的是本數(shù)組的首元素的地址,不能再變。

總結(jié)一下,C語(yǔ)言有兩種表示字符串的方法:一種是字符數(shù)組,另一種是字符串常量,它們?cè)趦?nèi)存中的存儲(chǔ)位置不同,使得字符數(shù)組可以讀取和修改,而字符串常量只能讀取不能修改。
值的可變性:
- 指針變量的值(pstr)是可以改變的,就是地址的改變;
- 數(shù)組名的值(str)是不能改變的,它只能指向本數(shù)組的首元素地址。
指向的內(nèi)容值:
- 字符指針數(shù)組內(nèi)的元素的值是常量,在內(nèi)存的常量區(qū),不能發(fā)生改變;
- 字符數(shù)組內(nèi)的元素是變量,在內(nèi)存的棧區(qū),是可以改變的。
在編程時(shí),若只需要到對(duì)字符串的讀取,那么字符數(shù)組和字符串常量都能滿足要求;若有寫入(修改)操作,則只能使用字符數(shù)組,不能使用字符串常量。