char str1 = "abc";
char str2 = "abc";
const char str3 = "abc";
const char str4 = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << (str1 == str2) << endl;
cout << (str3 == str4) << endl;
cout << (str5 == str6) << endl;
cout << (str7 == str8) << endl;
如果大家對於這樣的輸出結果已經心知肚明,那麼對於後面的說明,可以當作是幫小弟來查錯了。
現在來分析一下所以資料的記憶體分布:
char str1 = "abc":
這裡的"abc"是乙個常量,首先會在常量儲存區里儲存"abc"這個常量,然後會因為"abc"被賦值給str1,所以在棧中開闢一段記憶體,記憶體大小為4個節點(char陣列後會自動加乙個'\0'),然後又有乙個"abc"被儲存在棧中。
同理,str2中的"abc"也是儲存在棧中,位址不同。
到此,有三個"abc"被儲存起來,乙個在常量儲存區,另外兩個在棧中。
此外,插一句,c++記憶體被分為5個區,分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。
const char str3 = "abc":
對於這種被const修飾起來的變數,一般也是被儲存在常量儲存區,但是,但是對於const陣列來講,系統不確定符號表是否有足夠的空間來存放const陣列,所以還是為const陣列分配記憶體的。所以str3指向的是棧上的"abc"。
同理,str4也是儲存在棧中,位址不同。
const char *str5 = "abc":
因為"abc"在常量儲存區中儲存有乙份(即使沒儲存,這樣的操作也會新建乙份),這裡str5定義的時候,嘿,我見過這個,str5就可以開心的直接指向"abc"所在的常量區的位址。
同理str6,str7,str8。與const沒有半毛錢關係,const只是使得str5和str6無法指向新的字串常量(也就是新的位址)。
這道題的輸出結果是:
最後,還是乙個小測試:
char ch1 = 'a';
char ch2 = 'a';
const char ch3 = 'a';
const char ch4 = 'a';
cout << (ch1 == ch2) << endl;
cout << (ch3 == ch4) << endl;
大家可以思考一下結果是什麼... char 和char 的區別
1 char是乙個陣列定義,char 是指標定義 也稱char為靜態陣列,char 為動態陣列 2 指標和陣列的區別 1 指標和陣列的分配 陣列是開闢一塊連續的記憶體空間,陣列本身的識別符號 也就是通常所說的陣列名 代表整個陣列,可以使用sizeof來獲得陣列所佔據記憶體空間的大小 注意,不是陣列元...
char 和char 的區別
char c abc c 0 t char c1 def c1 0 t err 首先c1是乙個指標,它只是指向 def 這個記憶體塊。而 abc 是乙個常量區,不可以對其進行更改。而c定義的是乙個陣列,在分配記憶體時,會自動給它分配四個位元組的位址,並且會進行乙份拷貝工作,此時分配是在棧區進行的,是...
char 和char 的區別
之前在用到char 和char,用到srtncat,讓char對char 進行新增時執行會崩潰,之後做了一些分析和練習,對char 和char有了更深的理解。下面附上一些測試資料。include include include using namespace std int main cout do...