char str1[] = "abc"; char str2[] = "abc";
const char str3[] = "abc"; const char str4[] = "abc"; const char* str5 = "abc"; // 指向 "abc" 首地址
const char* str6 = "abc"; // 指向 "abc" 首地址
cout << (str1 == str2) << endl; //true or false
cout << (str3 == str4) << endl; cout << (str5 == str6) << endl;
- “char str1[] = "abc";”的含義是定義一個char型數組str1,初始化為abc。
- "abc"是一個常量,應該保存在常量存儲區。那么是不是str1就等於"abc"的地址呢?當然不是!str1是一個變量,保存在棧中,這句話的意思是在棧中申請大小為4的空間,保存"abc"(包括\0)。同理,“char str2[] = "abc";”也是在棧中申請了額外的空間保存"abc",也就是說,現在有3個"abc"字符串,分別保存在棧中和常量存儲區。那么我們應該清楚了,str1不等於str2。
- 對於“const char str3[] = "abc";”,大家千萬別被const欺騙了。我們知道,使用const定義的變量一般是不分配內存的,而是保存在符號表中。但是對於const數組來講,系統不確定符號表是否有足夠的空間來存放const數組,所以還是為const數組分配內存的。所以str3指向的是棧上的"abc"。同理“const char str4[] = "abc";”也是一樣。所以str3和str4不相同。
- 對於 “const char* str5 = "abc";”,str5是一個指針,保存在符號表上,指向的是常量存儲區中的"abc"。“const char* str5 = "abc";”中str6也是指向常量存儲區中的"abc",所以str5等於str6。
如欲想完全弄明白其中含義,我建議大家 去學習一下 匯編基礎知識,方可知道 C / C++ 等高級語言 的內存,指針 與 寄存器的之間關系
其實指針就是保存了 指向內存的地址 而已, 在匯編中 一般就是 用一個寄存器 去保存要訪問內存的地址,然后在CPU執行的時候,讓其 IP 命令執行地址寄存器 指向到那個地址,
然后以執行命令的方式進行向后執行。
