前面兩篇博文分別介紹了陣列與指標的知識,本篇將主要介紹兩者的聯絡與區別。希望對初學者有所幫助。
分別定義乙個陣列與乙個指標變數,如下:
int sarr[10] = ;
char *ptr =
『abcdefghi』;
/*通過下標訪問
/*通過間接訪問運算子*訪問
指標是左值(除非宣告為const),其值可以更改,陣列名是右值,其值不可以更改,具體操作如下:
/*指標變數是左值,陣列名是右值
*/char sarr[10] = ;
char *ptr = "abcdefghi";
ptr = sarr;//正確,指標變數
ptr是左值
sarr = ptr;//錯誤,陣列名是指標常量,其值不可修改
我們已經知道,任何乙個指標變數的長度都是機器字長,一般是4位元組,而陣列雖然是乙個指標常量,但其位元組長度並不一定為
4,具體如下:
/*指標變數所佔位元組長度相等,一般為
/*陣列名所佔位元組長度:型別長度乘以元素個數
指標陣列:
即儲存指標的陣列,陣列元素都是指標
陣列指標:
即指向陣列的指標
出了概念上的區別,還要主要他們使用上的不同,如下:
int * iarr[6] 指標陣列
含義:表示儲存指標的陣列
元素表示:*(iarr[i]),也可用
*iarr[i]
表示,因為
的優先順序高於
*int (*ptr)[6] 陣列指標
含義:指向陣列首位址的指標
元素表示:(*ptr)[i]
下列輸出字串的方法可行嗎?
/*輸出字串的方法可行性分析
*/char sarr[5] = ;
printf("sarr = %s\n",sarr);
以上輸出字串的方法不可行,字串的特點是遇到空字元結束,由於陣列的長度與字串的實際長度一致,導致字串並不能正常輸出,很有可能在字元e後繼續輸出其他字元,直到遇到空字元為止。
建議:
當用陣列儲存字串時,陣列長度至少要比字串長度大1,用於儲存空字元。
當對作為函式形參的陣列傳遞引數時,對其sizeof可以求的該陣列長度嗎?
void strlen(char arr[100])
不可以,無論陣列還是指標作為引數時接收的都是位址,由於位址佔機器字長(一般佔4個位元組),所以用陣列作為函式引數會退化為一般指標,其長度為機器字長。
指標變數是左值,陣列名是右值
陣列存放字串時要確保陣列長度至少比字串本身長度大乙個位元組
陣列作為函式引數傳遞時退化為一般指標,其長度佔機器字長個位元組(一般4位元組
)指標與陣列是重點也是難點,其中涉及好多易混淆的地方,所以建議大家學習中勤思考,多上機、勤總結。
C語言指標陣列與陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...
智慧型指標對比
智慧型指標對比 1 boost shared ptr 基於引用計數器refcount 原子的 1 建構函式中refcount 1,析構函式中refcount 1,當refcount的值減到為0時,該物件就會被銷毀。2 解決迴圈引用的問題 與weak ptr一起使用。weak ptr只引用不計數。3 ...
C語言指標 指標與陣列
1 指標與一維陣列 2 指標與二維陣列 3 指標陣列與陣列指標 指標裡面最難的一種就是指標與陣列了,對於指標和二維陣列來說這裡面的關係比較複雜。牽涉到編譯器的原理和編譯過程。1 指標與一維陣列 指標是指向乙個記憶體的位址,一維陣列的陣列名代表一塊記憶體 這個陣列 的首位址,和陣列首元素的位址一樣,但...