字符串数组 和 字符串指针 的区别
在C語言中,對字符串的操作主要有兩種方式,一是使用字符數組,char str[];二是使用字符指針。那么二者有什么區別呢?下面將分述二者的使用,最后進行比較。
一、字符數組
? ? ? ? 使用char str[]定義一個字符數組str,中括號內可以寫上數字表示數組大小,也可以不寫。如果不寫數字,則必須為字符數組提供初始值,以便編譯器進行內存分配。
可以使用字符串字面值(string literal)來初始化字符數組,也可使用字符字面值(character literal)初始化,如:
[cpp]?view plain?copy ? ?
只能對字符數組元素的賦值,而不能用賦值語句對整個數組賦值,如:
[cpp]?view plain?copy ? ?
可以使用循環將字符數組中的字符一個一個輸出,也可以使用cout<<str1直接輸出整個數組。
需要注意的是,上述代碼中str1和str2是C風格字符串,而str3不是。C風格字符串,是指以\0結尾的字符數組。C++為了兼容C,而保留了C中字符串的使用方法。
str1和str2使用字符串字面值進行初始化,字符串字面值使用\0表示字符串結束。因此str2長度為6,需要將\0計算在內。使用strlen函數,計算的是字符串的實際長度,不包含\0。
而str3則不一樣,它沒有\0作為結束標志,因而不是C風格字符串,使用cout<<str3可能會出現意想不到的結果。
二、字符指針
可以使用char *str指向一個字符串。如:
[cpp]?view plain?copy ? ?
使用cout<<ptr即可輸出整個字符串,而使用cout<<*ptr則輸出字符串的首字符。
字符指針也可指向C風格字符串,如ptr就是指向的C風格字符串。如果讓ptr指向上節中的str3,輸出ptr會出現同樣的意想不到的結果。畢竟數組名其實就是一種指針。
三、區別
前面簡單介紹了一下兩種操作字符串的方法,這部分進行比較,是本文的重點。如下代碼:
[cpp]?view plain?copy ? ?
下面說二者的不同之處。如下一段代碼:
[cpp]?view plain?copy ? ?
原因在于兩種方式對字符數組操作的機制不同。使用char *p="C++"語句后,編譯器在內存的文字常量區分配一塊內存,保存”C++“這一字符串字面值,然后在棧上分配內存保存p,p的內容為"C++"的地址。p[0]='c'試圖修改常量”C++“,程序當然就會崩潰了。而char ss[]="C++"語句,定義了一個數組,編譯器為其在棧上分配了內存空間,因而可以進行修改操作。
因此,可以總結如下:
(1)char ss[]定義了一個數組,ss可認為是一個常指針,ss不可改變,但ss指向的內容可以發生改變。
(2)char *p定義了一個可變指針,p可以指向其它對象。但對于char *p=”abc“這樣的情況,p指向的是常量,故內容不能改變。
如下代碼進一步說明char ss[]和char *p的區別:
[cpp]?view plain?copy ? ?
調用該函數,不一定能夠得到正確的結果。因為str定義了一個局部數據,是局部變量,存在于函數strA中的棧幀中。當函數調用完成后,棧幀恢復到函數strA調用前的狀態,臨時空間被重置,為函數分配的棧空間被收回,str所指向的地址也就不存在了。
將上述代碼修改:
[cpp]?view plain?copy ? ?
該函數能夠正常運行,因為str指向的字符串字面值被保存在只讀的數據段,是全局的,當函數調用完成后,str指向的地址未發生變化。
綜上,可以看出使用char []較容易出錯,可能出現不確定的結果。C++提供的string類相比之下,要安全的多了。
總結
以上是生活随笔為你收集整理的字符串数组 和 字符串指针 的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序运行的时间的估算
- 下一篇: 为什么8位有符号数的取值范围是-128~