處理字符串的字符數組和字符指針

我的主力博客:半畝方塘


我們知道,字符數組和字符指針都可以用來處理字符串,例如下面的兩條語句都是正確的:

char *p = "abc";
char a[4] = "abc";

第二行代碼大家都知道是正確的,下面我主要來解釋一下第一行代碼,第一行代碼是將字符串賦給一個字符指針,這個該怎麼理解呢?實際上,在第一行代碼中,編譯器首先在內存中開闢一塊存儲區域來存儲字符串中的每個字符,是以 'a','b','c','\0' 這樣的形式進行存儲的,然後用字符指針 p 指向該存儲區域的第一個字符的位置,如下圖所示:


字符數組和字符指針都可以用來處理字符串,它們在處理字符串的時候基本上除了以下幾行代碼沒有什麼區別:

scanf("%s", p);  // 語法上正確,但是實際上不一定
p = "abc";  // 同上,是正確的
scanf("%s", a);  // 正確,沒有任何問題
a = "abc";   // 大大的錯誤  

下面我們來解釋一下上面的代碼,首先我們來看第一行代碼,它實際上是輸入一個字符串然後將其存儲到指針 p 所在的區域,語法上正確,但是在實際執行時會引起錯誤,這是因爲,指針 p 指向一個內存區域,這個內存區域裏面到底存放的是什麼我們無從知道,一旦將字符串的內容寫入該存儲區域中,將會覆蓋該區域原來的值,可能會導致程序司機等問題,如果在這之前讓指針 p 真正指向一段完全可用的空間了,這行代碼纔是沒有問題的;接着看第二行代碼,由上面的分析可知,第二行代碼是正確的;第三行代碼中,將字符串寫入字符數組 a 所開闢的存儲空間,這段空間保證是完全可用的,完全沒有問題;至於第四行代碼怎麼就錯了呢?因爲數組一旦確定 a 便是一個常量,把字符串賦給 a 相當於對常量賦值,這是完全不能被允許的行爲,所以是錯的。

基本上除以上幾種情況外,字符數組和字符指針在處理字符串時是沒有什麼區別的,例如:

printf("%s", p);  // 得到 abc
printf("%s", a);  // 得到 abc

在上面的兩行代碼中,printf 函數中輸出格式爲 "%s" 時,後面應該跟上一個指針,a 轉換爲指針類型,它會從這個指針所指向的字符一直打印到 '\0' 爲止,中間沒有任何間隔符,所以,毫無疑問上面的兩行代碼都是正確的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章