做者 : 陳宗權web
先說說雙引號的字符串,好比"chenzongquan",它是由裏面我們看到的一系列字符以及一個尾隨的'\0'字符組成,存儲在內存的只讀存儲區中。只讀存儲區是在整個程序運行期間都保留着的、可見的,並且其中的數據原則上是保持不變的。因此對一個雙引號表示的字符串,只要你知道它的具體地址,能夠在程序的任何一個函數中再次使用。數組
說到只讀,要引一下,在16位系統中沒有進行內存訪問保護,因此在程序運行時實際上也能夠改變只讀存儲區中的數據,可是在32位系統中有內存訪問保護,程序運行時去改變只讀存儲區中的數據會引發異常。const的含義也是「只讀」,不過這個只讀只對編譯器起做用,編譯器能夠在必定程度上經過語法檢查避免對這種數據的修改操做。一旦程序運行起來,const是不起做用的。函數
再說說字符數組。字符數組是一組用來存放字符的空間。它的空間是可讀寫的。若是是全局變量,它會在整個程序運行期間一直保留;若是是局部變量,就只在它的做用域內存在。它本意是用來放一組字符,跟字符串沒有必然的關係,可是因爲歷史緣由,它跟字符串糾纏不清了。spa
說說歷史吧。在C語言中,基本數據類型沒有字符串類型(其實C++/Java/C#的基本數據類型中也一樣沒有字符串,只不過它們都提供一個封裝好的用於處理字符串的類型),可是程序中又常常要處理字符串,因此只好用字符數組來保存字符串了。字符數組做爲數組要求有固定的長度,可是字符串長度又不必定,因此採起了用一個措施,就是在字符數組中用'\0'來表示字符串到此結束,同在這個字符數組中可是在'\0'後面的字符就不算是這個字符串的了。爲了方便使用字符串,只要指定這個字符串的第一個字符的地址,經過它找到第一個字符,而後依次日後找就能找到第二個、第三個字符,以此類推,直到找到'\0'爲止,也就走遍了整個字符串了,所以C語法中規定經過第一個字符的地址來引用字符串。在數組中,數組名就表示數組中第一個元素的地址,相應的,在字符數組中,數組名就表示數組中第一個字符的地址,所以也就常常用字符數組名來引用其中的字符串。指針
字符數組中保存的只是一組字符,只有其中有'\0'字符時才能夠把這個字符數組當成字符串,因此字符數組未必都是字符串。orm
字符指針則是一個空間,用來保存地址,一個字符在內存中的地址,不保存字符。它原本跟字符串也沒有什麼牽扯,由於它保存的內容中根本連一個字符都沒有,只是別處的某個字符的地址而已。可是一樣因爲上面說到的歷史緣由,C語言中經過一個字符地址來引用字符串,因此每每經過字符指針來引用保存在內存中另外一個地方的字符串。字符指針獨立存在是沒有意義的,既然是保存另外一個地方的一個字符的地址的,必須真的在另外一個地方有一個字符,並且把它的地址保存到這個字符指針中以後,這個字符指針纔開始有意義,才能用這個字符指針去引用另外一個字符或者以那個字符爲首的字符串。blog