陣列與指標是不等價的,如:
陣列名的指向不可以改變,而指向陣列的指標是可以改變的。
請看如下**:
#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.兩個指標相加減 兩指標必須指向同一變數!否則運算沒有意義的...