多種方式下初始化字符串的過程分析

初始化字符串有多種方式,如下:

char a[]="abc";
//初始化方法一:這種情況下實際上規定了字符數組的大小爲4(含結尾的\0)
char *p="zxcd";
//初始化方法二:思考爲什麼這樣也可以初始化,p表示的是地址,"zxcd"是字符串,爲什麼可以劃等號。

實際上第一種數組的這種初始化方法在編譯器看來並不是初始化一個字符串,而是初始化多個字符,真正初始化一個字符串的操作應該如下:

char a[3]="ab";//記作寫法1,因爲要爲字符串結尾的'\0'預留位置,如果這裏寫作a[2]就會報錯

所以第一種初始化方法實際上等同於

char str[4] = {'a','b','c','\0'};

那麼實際上初始化的並不是字符串,而是一個個單獨的字符,我們知道字符串是存儲在內存的常量區,那麼上面這種初始化方式實際上“字符串”並不是存儲在常量區,如果這時候的“字符串”是寫在函數內部的話,是存儲在棧區的,如果寫在全局區,是存儲在靜態區的。


我們再來看第二種初始化方法,來思考爲什麼地址和字符串可以劃等號

注意一點:字符串常量一旦出現在表達式中,那麼字符串表達的就已經是地址了!

在第二種初始化方法中的雙引號實際上做了三件事

1、申請了空間(在常量區),存放了字符串

2、在字符串尾加上了'/0'

3、返回地址

所以實際上並不存在地址和字符串劃等號的情況,之前也說過字符串常量是存放在常量區的,"ab"表達式使用的值是指向常量區的地址,而並不是字符串本身,所以可以將該表達式賦值給指針。


另外我們再來看寫法1,一種看上去與寫法1“類似”的寫法的是

char a[3];
a="ab";

但是這個卻報錯了,爲什麼?

因爲雖然字符串出現在表達式中是地址,而a也是地址,但是數組的地址是常量,給常量賦值必然是會報錯的。

所以這次需要知道的結論是字符串如果出現在表達式中就是表示地址的,而單個的字符則不是。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章