我們知道,字符數組和字符指針都可以用來處理字符串,例如下面的兩條語句都是正確的:
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'
爲止,中間沒有任何間隔符,所以,毫無疑問上面的兩行代碼都是正確的。