這裡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...