論陣列與指標 03 陣列指標 步長

2021-10-08 14:13:16 字數 1706 閱讀 2153

這裡a是個二維陣列的陣列名,相當於乙個二級指標常量;//二維陣列名與二級指標毫無關係(初學者常常混淆)。

p是乙個指標變數,它指向包含5個int元素的一維陣列,此時p的增量以它所指向的一維陣列長度為單位;

*(p+i)是一維陣列a[i][0]的位址;

*(p+2)+3表示a[2][3]位址(第一行為0行,第一列為0列),*(*(p+2)+3)表示a[2][3]的值。

//(*p)[5]其中的5換成其他的數字在vc++6.0環境中都無法通過編譯

「二維陣列、陣列指標、指標陣列(iliffe向量)」相關概念見

此處不再贅述。

首先看乙個例子,**並對比p++,r++,t++每次增加的步長是多少位元組。

#include #include int main(int argc, char** ar**)

列印結果:(其中int型別佔4bytes)

p=6421920   r=6421920   t=6421920

p=6421968   r=6421936   t=6421924

步長(t) =1   *4bytes =  4bytes;

步長(r) =4   *4bytes = 16bytes;

步長(p)=4*3*4bytes = 48bytes;

那麼上例中p、r、t 各代表什麼意思呢?

int (*p)[3][4] = a; 宣告了*p是乙個「擁有著3個陣列,而這每乙個陣列擁有4個整型元素」的陣列,因此,p就是乙個指向這樣的陣列的指標;

類似的,*r是乙個擁有「4個整型元素」的陣列,r是乙個指向該陣列的指標;

由於在某種場合下(陣列作為函式定義的形式引數),陣列名代表陣列首元素的位址,那麼a[0][0]代表元素a[0][0][0]的位址,所以t是乙個指向a[0][0][0]的指標;

因此,p的步長為12*4bytes;r的步長為4*4bytes;t的步長為1*4bytes;

不妨再看乙個例子,

#include #include void test(char **ptr)

}int main(int argc, char** ar**)

;//指標陣列

char c[3][5];

char (*q)[5] = c;//陣列指標

test(p);

printf("%d\n",q);

q++;

printf("%d\n",q);//+5bytes

char (*r)[3][5] = &c;

r++;

printf("%d\n",r);//+15bytes

return 0;

}

通過第乙個例子,可以很輕鬆的計算出q的步長;這裡的r代表了整個陣列的步長。

char (*r)[3][5] = &c; 宣告了*r是乙個「擁有3個陣列,每個陣列有5個整型元素」的陣列,而r是乙個指向這樣的陣列的指標;char型別大小為1byte,所以r的步長為3*5*1byte。

思考:對於陣列a[3],a,&a,a+1,&a+1有什麼區別?&a佔記憶體嗎?

關於這個問題的解釋請看: 陣列名a和陣列名取位址&a的區別

論指標與陣列

指標和陣列有的書上說 完全相同,有的卻說完全不相同。那到底哪乙個說的對呢?下面我們來對比一下 char str 10 定義乙個陣列裡面有 10個元素 char pstr str 把陣列 首元素的位址賦給指標 1 char pstr str 把陣列 首位址賦給指標 2 1和 2的區別 1是取得陣列首元...

C計畫 03 陣列指標 與 指標陣列

指標陣列 char p 2 for int i 0 i 2 i 根據c語言運算優先等級表,指標也是乙個變數,這裡的 char p 2 指的是定義了乙個一維陣列,陣列裡存放的是指標變數,而指標指向的則是後面字串的首個字元的位址。後面printf 中,列印字串只需要給出首個字元地位址即可。int tem...

指標與陣列,指標陣列 陣列指標

int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...