C語言 陣列與指標不等價

2021-10-07 02:29:30 字數 1759 閱讀 2378

陣列與指標是不等價的,如:

陣列名的指向不可以改變,而指向陣列的指標是可以改變的。

請看如下**:

#include int main(void)

, *p = a;

char i;

// 陣列遍歷方式一

for ( i = 0; i < 5; i++ )

// 陣列遍歷方式二

for ( i = 0; i < 5; i++ )

return 0;

}

陣列遍歷方式一:使用指標遍歷陣列元素,*p++等價於*(p++),即指標指向的位址每次後移乙個單位,然後再取位址上的值。這裡的乙個單位是sizeof(int)個位元組,至於為什麼是sizeof(int)個位元組可以查閱我的總結c語言指標變數的運算。

陣列遍歷方式二:使用陣列名自增遍歷陣列元素,編譯出錯,錯誤如下:

error: value required as increment operand
因為陣列名的指向是不可以改變的,使用自增運算子自增就會改變其指向,這是不對的,陣列名只能指向陣列的開頭。但是可以改為如下遍歷方式:

for ( i = 0; i < 5; i++ )

這可以正確遍歷陣列元素。因為*(a+i)與a[i]是等價的。

字串指標指向的字串中的字元是不能改變的,而字元陣列中的字元是可以改變的。

請看如下**:

//字串定義方式一

//字串定義方式二

字串定義方式一:字串中的字元是可以改變的。如可以使用類似str[3]='q'這樣的語句來改變其中的字元。原因就是:這種方式定義的字串儲存在全域性資料區或棧區,是可讀寫的。

字串定義方式二:字串中的字元是不可以改變的。原因就是:這種方式定義的字串儲存在常量區,是不可修改的。

具體可查閱:char *str與char str的區別

ps:關於c記憶體記憶體的總結可查閱我的總結:通俗易懂的c語言記憶體總結

求陣列長度時,借用陣列名可求得陣列長度,而借用指標卻得不到陣列長度。

請看如下**:

#include int main(void)

, *p = a;

char len = 0;

// 求陣列長度方式一

printf("方式一:len=%d\n",sizeof(a)/sizeof(int));

// 求陣列長度方式二

printf("方式二:len=%d\n",sizeof(p)/sizeof(int));

return 0;

}

執行結果

方式一:len=5
方式二:len=1
求陣列長度方式一:借用陣列名來求陣列長度,可求得陣列有5個元素,正確。

求陣列長度方式二:借用指標求陣列長度,求得長度為1,錯誤。原因是:

p只是乙個指向int型別的指標,編譯器不知道其指向的是乙個整數還是指向乙個陣列。sizeof(p)求得的是p這個指標變數本身所占用的位元組數,而不是整個陣列占用的位元組數。

以上就是指標與其指向的陣列的三個典型的區別:(1)遍歷陣列時需要注意;(2)修改字串中的字元時需要注意;(3)求陣列長度時需要注意。

C語言指標陣列與陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...

C語言指標 指標與陣列

1 指標與一維陣列 2 指標與二維陣列 3 指標陣列與陣列指標 指標裡面最難的一種就是指標與陣列了,對於指標和二維陣列來說這裡面的關係比較複雜。牽涉到編譯器的原理和編譯過程。1 指標與一維陣列 指標是指向乙個記憶體的位址,一維陣列的陣列名代表一塊記憶體 這個陣列 的首位址,和陣列首元素的位址一樣,但...

C語言指標 指標與陣列

一 指標的運算 指標可以進行三種運算 1.指標加上整數 如果指標p指向陣列a i 那麼指標p j 指向a i j 前提是a i j 存在!2.指標減去整數 如果指標p指向陣列a i 那麼指標p j 指向a i j 前提 a i j 存在!3.兩個指標相加減 兩指標必須指向同一變數!否則運算沒有意義的...