|
Advance Member
|
指標是C/C++難學的一環,也是它強大的一環。一開始會搞不清楚是很正常的,唯有多練多思考囉!
1)其實 char* PP[] 並非真的存入"3個字串",而是存入"3個字元指標(就是指字串)",所以PP[0]也是一個指標而已,而不是真的一個字串。用一個指標來代表字串的原因在於,C/C++中並沒有內建"字串"這種資料型態(C++的標準類別庫中有,但仍然不是"內建"資料型態),所以用指向字元的指標來代表一個字串的起始位址,從這個位址起到第一個'\0'為止,視為一個字串。我就延伸你的例子來說明:
char* PP[]={ "Merry Christmas",
"Happy Birthday",
"Happy New Year"
};
int num=(sizeof(PP))/(sizeof(PP[0]));
cout << "sizeof(PP) : " << sizeof(PP) << endl;
cout << "sizeof(PP[0]) : " << sizeof(PP[0]) << endl;
cout << "Element count : " << num << endl;
執行之後,你會發現 sizeof(PP) 是 12, sizeof(PP[0]) 是 4,而元素數量是 3。關鍵在 sizeof(PP[0]) 上,這裡得到"在這個系統中指標所佔的記憶體大小(別忘了,指標也是一種資料型態,也佔記憶體,它所代表的值就是某個記憶體位址)",在windows & linux 上都是 4 個 bytes(我不清楚這是因 OS 還是硬體架構而異),所以這個「指標陣列」一共 12 個 bytes, 所以算下來可以得知有 3 個指標,也就是 3 個字串。
2)
char* PP[]={ "Merry Christmas",
"Happy Birthday",
"Happy New Year"};
這個就是一個字串陣列呀!和上面提到的一樣,C/C++沒有內建字串資料型態,所以用"指向字元的指標"來代表一個字串的開頭,再以第一個'\0'作為結尾;所以與其說這是一個"指標型態的字串陣列",不如說是"C風格的字串陣列"!因為在C++中,使用"String"這種class 來替代 char* 是比較好的解決方案。至於"彈性"的問題,使用 char* 的彈性是比 char[size] 來得高,因為這個 size 在編譯時就要決定了;但是"彈性"的需求也是視狀況而定,若是要處理的資料長度變動不大,使用 char[size] 會是比較有效率的作法(因為OS尋找可用的記憶體空間也是需要花費一些時的)。
|