C++ 中 字符數組 和 指針 區別


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;
  1. “char str1[] = "abc";”的含義是定義一個char型數組str1,初始化為abc。
  2. "abc"是一個常量,應該保存在常量存儲區。那么是不是str1就等於"abc"的地址呢?當然不是!str1是一個變量,保存在棧中,這句話的意思是在棧中申請大小為4的空間,保存"abc"(包括\0)。同理,“char str2[] = "abc";”也是在棧中申請了額外的空間保存"abc",也就是說,現在有3個"abc"字符串,分別保存在棧中和常量存儲區。那么我們應該清楚了,str1不等於str2。
  3. 對於“const char str3[] = "abc";”,大家千萬別被const欺騙了。我們知道,使用const定義的變量一般是不分配內存的,而是保存在符號表中。但是對於const數組來講,系統不確定符號表是否有足夠的空間來存放const數組,所以還是為const數組分配內存的。所以str3指向的是棧上的"abc"。同理“const char str4[] = "abc";”也是一樣。所以str3和str4不相同。
  4. 對於 “const char* str5 = "abc";”,str5是一個指針,保存在符號表上,指向的是常量存儲區中的"abc"。“const char* str5 = "abc";”中str6也是指向常量存儲區中的"abc",所以str5等於str6。

 

如欲想完全弄明白其中含義,我建議大家 去學習一下 匯編基礎知識,方可知道 C / C++ 等高級語言 的內存,指針  與 寄存器的之間關系

  其實指針就是保存了 指向內存的地址 而已, 在匯編中 一般就是 用一個寄存器 去保存要訪問內存的地址,然后在CPU執行的時候,讓其 IP 命令執行地址寄存器 指向到那個地址,

然后以執行命令的方式進行向后執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM