下面這個程式和程式下面的文字可以較好的體現
#include
intmain()
,,};
int(
*p)[5]
;//此處不能去除括號!否則就不再是指向某個陣列的【指標】
//而是變成乙個存放指標的【陣列】
//即*p[5]=*(p[5]),裡面就只能存放5個指標
p=a;
//把陣列首位址a放入p中(a的位址就是a[0]的位址),所以等價於把a[0]的位址放入p
//上面兩行最好合併為int (*p)[5]=a;
printf
("*p[0] = %d\n"
,*p[0]
);printf
("a=%p\n"
,a);
//a=a[0]
printf
("a[0]=%p, p=%p\n"
,a[0
],p)
;//a[0]=p
printf
("a[1]=%p, p+1=%p\n"
,a[1
],p+1)
;//a[1]=p+1
printf
("a[2]=%p, p+2=%p\n\n"
,a[2
],p+2)
;//因為p在定義時就為int,每一行就有5個int,所以p+1實際上移動了20個int大小
printf
("sizeof(*(p+1))=%d\n\n"
,sizeof(*
(p+1))
);//*(p+1)表示的是第一行的資料,即a[0]的所有資料
printf
("a[1][1]=%d, *(p+1)[0]=%d\n"
, a[1]
[0],
*(p+1)
[0])
;//所以*(p+1)==a[1]
printf
("a[1][1]=%d, *(*(p+1)+1)=%d\n\n"
, a[1]
[1],
*(*(p+1)
+1))
;//同理,因為*(p+1)==a[1],即*(p+1)是乙個指標,那就可以通過指標的操作獲得裡面的資料
//即:*(*(p+1)+1)=a[1][1]
//*(p+1)+1外面的乙個+1是指標移動了1個int大小
printf
("sizeof(*(*(p+1)+1))=%d\n\n"
,sizeof(*
(*(p+1)+
1)))
;return0;
}
輸出為:
*p[0]
=0a=0x7ffd1feb8f00a[0
]=0x7ffd1feb8f00
, p=
0x7ffd1feb8f00a[1
]=0x7ffd1feb8f14
, p+1=
0x7ffd1feb8f14a[2
]=0x7ffd1feb8f28
, p+2=
0x7ffd1feb8f28
sizeof(*
(p+1))
=20a[1
][1]
=4,*
(p+1)[
0]=4
a[1][
1]=5
,*(*
(p+1)+
1)=5
sizeof(*
(*(p+1)+
1))=
4
參考**: C語言二維陣列指標(指向二維陣列的指標)
二維陣列的定義 int matrix 見圖的操作那篇文章裡面的定義 或者這篇文章提供了另外一種方法。二維陣列在概念上是二維的,有行和列,但在記憶體中所有的陣列元素都是連續排列的,它們之間沒有 縫隙 以下面的二維陣列 a 為例 int a 3 4 從概念上理解,a 的分布像乙個矩陣 0 1 2 3 4...
c語言,指標與陣列 指標與二維陣列2
include typedef int tp parry1 3 define uart printf printf void f1 void a 二維陣列名 equal 指向一維陣列的指標 tp parry1 p a int q 3 a int t 2 a warning initializatio...
二維陣列 指標陣列與陣列指標
一 首先我們從字面意思理解一下什麼是指標陣列什麼是陣列指標 1 指標陣列 本質是乙個陣列,陣列中的每乙個元素是乙個指標。2 陣列指標 本質是乙個指標,而指標指向乙個陣列。二 我們該怎麼區分指標陣列和陣列指標?1 總共有三種表示形式 int p 4 和int p 4 和int p 4 表面看起來是不是...