C中的数组名指针怎么理解?

如:int A[2][3][4];这个三维数组,请帮我仔细分析,数组中哪些是指针,指向哪里

第1个回答  2019-03-09
这么又有这题,我刚才也回答了一个蛮像这个的。。。
要点1:就是一维数组名是一把一级指针,二维数组名是一把二级指针,三维的可类推
要点2:int
a[4];
a+0,
a+1,
a+2……=====
&a[0],
&a[1],
&a[2]……即表示的是地址而*(a+0),
*(a+1),
*(a+2)……========a[0],a[1],a[2]……表示的是内容
要点3:多级指针,如
int
a[3][4];则只有a[n][n]{或*(a[n]+n)或*(*(a+n)+n),三者等价,表达不同而已}是表示内容的(即具体值),a+n(即&a[n]
)和
*(a+n)即a[n]
则是表示地址(注意和一维的[]表示内容区别)
int
a[10],*p;
则a[0]和*(a+0),
a[1]和*(a+1),
a[2]和*(a+2)……是一样的p
=a;
,则,*(p+0)
=
p[0]=a[0]=*(a+0),
*(P+1)=p[1]=a[1]=*(a+1)……而二维的,int
a[10][10],
**p,
*T;
则,a[0][0]=*(*(a+0)+0),
a[0][1]
=
*(*(a+0)
+
1)……a[1][0]=*(*(a+1)+0)p
=
a;
则p的用法同a是一样的哦而T是一维指针,所以只能
T
=
a[0]
(或a[1],a[2]……或*(a+0),*(a+1)……)这样,T每次就指向了二维数组的每一行a[0][0]=T[0],
a[0][1]=T[1]……这样,那么如何表示
a[1][0],a[2][0]……即不同行的数呢,呵呵,那么我们也可以换行表示它!请看:*(T+1*10+0)
=
a[1][0]
*(T+2*10+4)
=
a[2][4],
你完全也可*(T+10)和*(T+24)表示它们但是,你有没有发现,上面
T+i*10(每行的个数)+
n(该行第几个)
,把一维的指针二维化(好好体会)这也说明二维数组在内存中也是线性而已,只是按行存的(下面有举例)(当然指针和数组还是有区别的,不过对该问题没影响,所以就不要给你乱上乱了)
先给你讲讲二维数组吧如:int
A[3][4];
<-------定义了一个3行2列的数组你可以这样想像它的内存是这样分布的:A[0][0]
A[0][1]
A[0][2]
A[0][3]
<------共3行,每行4个数(这就是A[3][4]的行和列的意义哦)A[1][0]
A[1][1]
A[1][2]
A[1][3]A[2][0]
A[2][1]
A[2][2]
A[2][3]然而,它在内存中仍是线性的储存的,只是一行一行地存哦!!(但我们上面的理解也是对的,请看下面)A[0][0]
A[0][1]
A[0][2]
A[0][3]
A[1][0]
A[1][1]
A[1][2]
A[1][3]
A[2][0]
A[2][1]
A[2][2]
A[2][3]因此也可以想像是多个一维的数组合成的哦!
-------------即有
int
A[2][3][4];
A,A[n],A[n][n]都是指针,而只有A[n][n][n]是内容哦(内存中储存的值)其中,A相当开三级指针(int
***p)---若A[0][0][0],则,A+1=A[1][0][0],A+2=A[2[0][0],即每移动1会变一“面”~~~~A[n]相当于二级指针(int
**p)---若A[0][0][0],则,A[0]+1=A[0][1][0],A[0]+2=A[0][2][0],即每移动1会变一行,面不变(还是在该面)A[n][n]相当于一级指针(
int
*p)---若A[0][0][0],则,A[0][0]+1=A[0][0][1],A[0][0]+2=A[0][0][2],即每移动1就是下一个数,面行不变这就是不同级指针的区别了~~~~~说得好像有点乱了,希望能看懂!
相似回答