指標、陣列、字串是c/c++語言中重要的組成部分,很多人認為指標比較難理解,而初學者更容易在這裡犯錯誤,其實當你真正理解其本質後,也就不難了。
首先來看一些錯誤用法的示範:
// 錯誤示範1 - 嘗試修改唯讀區域
char *p1 = "this is a constant string, it's read only.";
p1[3] = 'x';
// 錯誤示範2 - 把乙個字串賦給陣列名
char str1[32];
str1 = "something funny";
// 錯誤示範3 - 把字串直接賦給乙個new分配的指標
char *p2 = new char[32];
p2 = "hello, world";
std::cout << p2 << std::endl;
delete p2;
錯誤示範一中把乙個字串賦給乙個指標,字串是儲存在唯讀資料區,是不能被修改的。錯誤示範二中不能把乙個字串賦給陣列名,因為陣列名本身是乙個const指標,而應用strcpy。錯誤示範三是很多初學者容易犯的錯誤,這是想當然的做法,對p2指標賦字串應用strcpy,不能直接賦值,直接賦值等於把之前的指標值覆蓋掉了,等下delete的時候就會出問題。
再來看兩個新鮮的用法:
std::cout << "abcde"[2] << std::endl;
std::cout << 3["abcde"] << std::endl;
以上兩種表述都是合法的,你沒有接觸過很正常,因為誰也不會寫那樣的**。這兩句話執行後輸出字元c和d,想要理解這裡的語法必須要理解陣列的本質。
我們知道陣列的一般定義是:
type name[index];
實際上也可理解為這樣:
type index[name];
編譯器對它的理解都是*(name + index),也就是不管怎麼寫它都把它轉成指標,知道了這個後那兩句話就不難理解了。
這裡對指標、陣列、字串作乙個總結性的描述:
1)指標就是乙個變數,裡面儲存乙個位址,指標本身需要佔儲存空間,所以其本身也擁有位址,指標變數本身的位址是不變的,但該變數裡面儲存的值可以改變,不要將指標本身的位址和它裡面儲存的位址混淆。訪問指標所指向的內容之前必須確保其指向了有效位置。
2)陣列就是一段儲存有n個相同型別資料的連續記憶體, 資料型別可以為任意。
3)字串的本質是一段以0結束的連續記憶體,在操作字串時必須小心0的位置。
深入理解字串指標和字串陣列
首先我們來看一段程式 include int main 它的輸出結果如圖 分析 我們首先宣告了乙個字串陣列和乙個字串指標。然後將他們等同型別的輸出做對比。從輸出結果我們可以看到,想要輸出整個字串。分別以 s格式輸出str和ps即可。1.字串指標名ps和陣列名str都存放著字串的首位址。而字串本身存放...
字串指標和字元陣列
很多剛從c 轉c 的人都不明白,在c 中這樣的 char pchar hello!定義字元指標pchar 指向乙個字元陣列首 元素即h pchar h 問題所在行 到了c 中怎麼就不行了?你翻遍參考書,都會說,pchar 指向的是常量,怎麼能允許改變呢?你又問了,怎麼我在c 中執行的好好的?沒人回答...
C 字元 字串 字元陣列 字串指標 指標陣列
一 c 字元 字串 字元陣列 字串指標 指標陣列 前言 一 字元指標 字元陣列 二 字串指標 三 字串 指標陣列 四 常用方法 參考為了深入理解c 並時常回顧學過的知識點,對c 知識點進行記錄總結。參考1字元指標的儲存方式 字元指標變數本身是乙個變數,用於存放字元 字串的首位址。字串本身是存放在以該...