02.27 C語言字符串數組和字符串指針的區別

預備知識:

C語言中,字符數組和字符串指針都可以用來存儲字符串:

char *pstr = "china";

char str[] = "china";

但兩者在內存中的存儲區域是不一樣的:

  • 字符指針的字符串存儲在常量區;
  • 而字符數組則存儲在棧區。

如下圖所示,字符指針pstr指向字符串"china"常量的首地址,字符數組str指向的是在棧區的地址。

C語言字符串數組和字符串指針的區別

棧區的字符串(也包括其他數據)有讀取和寫入的權限,而常量區的字符串(也包括其他數據)只有讀取權限,沒有寫入權限。因此,帶來兩方面的區別。

1、指向內容的可變性

字符串一旦被創建就存在於常量池中。

char *pstr = "china";

這是對字符指針進行初始化,此時字符指針指向一個字符串常量的首地址,常量是不能改變的。

char str[] = "china";

這是以字符數組形式創建的字符串,實際上是從字符串常量池中複製了一個副本,所以修改字符數組的內容時,只是修改的自己的副本,並不會影響到常量池中的字符串。

下面代碼直接修改 pstr[0] 的值是錯誤的(能夠正常編譯和鏈接,但在運行時會出現段錯誤(Segment Fault)或者寫入位置錯誤);而修改 str[0] 的值則是可以的。

C語言字符串數組和字符串指針的區別

2、值的可變性

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

C語言字符串數組和字符串指針的區別

總結一下,C語言有兩種表示字符串的方法:一種是字符數組,另一種是字符串常量,它們在內存中的存儲位置不同,使得字符數組可以讀取和修改,而字符串常量只能讀取不能修改。

值的可變性:

  • 指針變量的值(pstr)是可以改變的,就是地址的改變;
  • 數組名的值(str)是不能改變的,它只能指向本數組的首元素地址。

指向的內容值:

  • 字符指針數組內的元素的值是常量,在內存的常量區,不能發生改變;
  • 字符數組內的元素是變量,在內存的棧區,是可以改變的。

在編程時,若只需要到對字符串的讀取,那麼字符數組和字符串常量都能滿足要求;若有寫入(修改)操作,則只能使用字符數組,不能使用字符串常量。

C語言字符串數組和字符串指針的區別


分享到:


相關文章: