c++ 二维数组_【技术篇】C指针与二维数组深度辨析

一、源代码

/*第01行*/    

v2-cebeb1612d8d703445a663057d866a9d_b.jpg
CLion 2019.3.4 x64中编写的源代码·截图

二、深度辨析

v2-d2ae387790a8dd2aee1fe7d65e8e6262_b.jpg
CLion 2019.3.4 x64中编译的结果·截图

v2-04de867eb84843ac121a7717cc893731_b.png
zippo[4][2]是一个四行二列的int型二维数组

①不论一维数组还是二维数组,数组名就是指向数组首个元素的指针,也即数组名就是数组首个元素的地址。

二维数组 数组名zippo是数组zippo[2][4]首个元素zippo[0][0]的地址,数组名zippo是指向数组zippo[2][4]第一行(包含两个int型)的指针。

一维数组 数组名zippo[0]是数组zippo[2][4]首个元素zippo[0][0]的地址,数组名zippo[0]是指向数组zippo[2][4]第一行第一列(包含一个int型)的指针。

指针解释:zippo是指向zippo[0]的指针,zippo[0]是指向zippo[0][0]的指针,可以推导出三个表达式:*zippo=zippo[0],*zippo[0]=zippo[0][0],**zippo=zippo[0][0]。

取址解释:zippo[0][0]取地址就是zippo[0],zippo[0]取地址就是zippo,可以推导出两个表达式:&zippo[0][0]=zippo[0],&zippo[0]=zippo。

②给指针或地址进行数值增减1 ,其值会增减对应类型大小的数值。

——————————————————————————————————————

/*第04行*/ printf(" zippo=%p, zippo+1=%pn",zippo,zippo+1);

编译后的结果:zippo=0xffffcc00, zippo+1=0xffffcc08

解释:二维数组的数组名zippo(指针类型)是指向数组名为zippo[0](仍为指针类型)的一维数组的指针。数组名为zippo[0]的一维数组中每个元素占用两个int类型,即zippo[0]指向{2,4}(的首个元素的地址),zippo[1]指向{6,8}(的首个元素的地址),zippo[2]指向{1,3}(的首个元素的地址),zippo[3]指向{5,7}(的首个元素的地址)。

所以,当zippo=0xffffcc00时, zippo+1=0xffffcc00+sizeof(2*int)=0xffffcc08

——————————————————————————————————————/*第05行*/ printf(" zippo[0]=%p,zippo[0]+1=%pn",zippo[0],zippo[0]+1);

编译后的结果: zippo[0]=0xffffcc00,zippo[0]+1=0xffffcc04

解释:二维数组 数组名zippo是数组zippo[2][4]首个元素zippo[0][0]的地址,一维数组 数组名zippo[0]也是数组zippo[2][4]首个元素zippo[0][0]的地址,所以zippo[0]=zippo=0xffffcc00。zippo[0]指向{2,4},其所指向的对象虽然有两个元素,但每个元素都是int类型,所以当zippo[0]=0xffffcc00时, zippo[0]+1=0xffffcc00+sizeof(int)=0xffffcc04

——————————————————————————————————————/*第06行*/ printf(" *zippo=%p, *zippo+1=%pn",*zippo,*zippo+1);

编译后的结果:*zippo=0xffffcc00, *zippo+1=0xffffcc04

解释:*zippo=zippo[0]=0xffffcc00,*zippo+1=zippo[0]+1=0xffffcc00+sizeof(int)=0xffffcc04

——————————————————————————————————————/*第07行*/ printf(" zippo[0][0]=%dn",zippo[0][0]);

编译后的结果:zippo[0][0]=2

解释:zippo[0][0]表示数组zippo[4][2]中第一个元素(第一行第一列),为2

——————————————————————————————————————/*第08行*/ printf(" *zippo[0]=%dn",*zippo[0]);

编译后的结果:*zippo[0]=2

解释:zippo[0]指向{2,4},进一步解释为zippo[0]是指向数组{2,4}中首个元素2的指针,所以*zippo[0]为zippo[0]所指向的地址对应存储的内容,为2

——————————————————————————————————————/*第09行*/ printf(" **zippo=%dn",**zippo);

编译后的结果:**zippo=2

解释:zippo=0xffffcc00,zippo=zippo[0]=0xffffcc00,**zippo=*zippo[0]=2

—————————————————————————————————————/*第10行*/ printf(" zippo[2][1]=%dn",zippo[2][1]);

编译后的结果:zippo[2][1]=3

解释:zippo[2][1]表示数组zippo[4][2]中第六个元素(第三行第二列),为3

——————————————————————————————————————/*第11行*/ printf("*(*(zippo+2)+1)=%dn",*(*(zippo+2)+1));

编译后的结果:*(*(zippo+2)+1)=3

解释:zippo是指向zippo[0]的指针,所以zippo+2是指向zippo[2]的指针,进而

*(zippo+2)=zippo[2],zippo[2]是指向{1,3}中首个元素1的指针,所以zippo[2]+1是指向{1,3}中第二个元素3的指针,所以*(*(zippo+2)+1)=*(zippo[2]+1)=3

——————————————————————————————————————/*第12行*/ printf(" zippo=%pn" " &zippo[0]=%pn" " &zippo[0][0]=%pn",zippo,&zippo[0],&zippo[0][0]);

编译后的结果:

zippo=0xffffcc00

&zippo[0]=0xffffcc00

&zippo[0][0]=0xffffcc00

解释:zippo是指向数组zippo[4][2]首个元素zippo[0][0]的地址,即zippo是元素zippo[0][0](在数组中为2)的地址;zippo[0]是指向{2,4}首个元素的指针,&zippo[0]是{2,4}首个元素的地址,即&zippo[0]是数组中元素2(仍然对应为zippo[0][0])的地址。

所以,zippo=&zippo[0]=&zippo[0][0]=0xffffcc00

——————————————————————————————————————

v2-36bfa0d9feac517a918cfe0c349f77f2_b.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值