C語言陣列與指標對比

2021-07-23 22:51:51 字數 2246 閱讀 2806

前面兩篇博文分別介紹了陣列與指標的知識,本篇將主要介紹兩者的聯絡與區別。希望對初學者有所幫助。

分別定義乙個陣列與乙個指標變數,如下:

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 指標與一維陣列 指標是指向乙個記憶體的位址,一維陣列的陣列名代表一塊記憶體 這個陣列 的首位址,和陣列首元素的位址一樣,但...