一、源代码
/*第01行*/
二、深度辨析
①不论一维数组还是二维数组,数组名就是指向数组首个元素的指针,也即数组名就是数组首个元素的地址。
二维数组 数组名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
——————————————————————————————————————