上节我们搞定了一维数组,这回我们看看二维数组,二维数组实际上是穿了马甲的一位数组,老样子我们看看下面例子
比如我们有如下数组
int abc[2][8] ={
{11,12,13},
{21,22,23},
};
实际上它由两个一维数组组成,数组名分别是abc[0]和abc[1]
abc[0][8]={11,12,13} //注意把abc[0]整个看作是数组名,或者是指针名,相当于前一章节的数组名b
abc[1][8]={21,22,23}
那么我们是否能像前一章节那样通过数组名访问数组中的元素呢?比如用 *(abc[0] + 1) 来访问数组abc[0]的第二个元素
敲入如下代码看看结果如何
int abc[2][8] ={
{11,12,13},
{21,22,23},
};
printf("size of int is %d\n",sizeof(int));
printf("size of abc is %d \n",sizeof(abc));//得到整个数组abc的大小
printf("size of abc[0] is %d \n",sizeof(abc[0])); //可以得到子数组abc[0]的大小
printf("size of abc[0][0] is %d \n",sizeof(abc[0][0]));
printf("1abc[0][0]=%d \n",abc[0][0]);
printf("2abc[0][1]=%d \n",abc[0][1]);
printf("3abc[0]=%d \n",abc[0]);
printf("4abc[1]=%d \n",abc[1]);
printf("5*abc=%d \n",*abc);
printf("6*abc[0]=%d \n",*abc[0]); //把abc[0]看成第一个数组名,然后当成指针来操作
printf("6*(abc[0]+1)=%d \n",*(abc[0]+1));
printf("6*(abc[0]+2)=%d \n",*(abc[0]+2));
printf("7*abc[1]=%d \n",*abc[1]); //把abc[1]看成第二个数组名</span>
printf("7*(abc[1]+1)=%d \n",*(abc[1]+1));
printf("7*(abc[1]+2)=%d \n",*(abc[1]+2));
printf("8addr of abc=%p \n",abc);
printf("9addr of &abc=%p \n",&abc);
printf("10addr of abc[0]=%p \n",abc[0]);
printf("11addr of abc[1]=%p \n",abc[1]);
printf("12addr of &abc[0]=%p \n",&abc[0]);
printf("13addr of &abc[1]=%p \n",&abc[1]);
printf("14addr of *abc[0]=%p \n",*abc[0]);
printf("15addr of *abc[1]=%p \n",*abc[1]);
printf("16addr of &(*abc[0])=%p \n",&(*abc[0]));
printf("17addr of &(*abc[1])=%p \n",&(*abc[1]));
printf("18addr of abc[0][0]=%p \n",abc[0][0]);
printf("19addr of abc[0][1]=%p \n",abc[0][1]);
printf("20addr of &abc[0][0]=%p \n",&abc[0][0]);
printf("21addr of &abc[0][1]=%p \n",&abc[0][1]);
运行结果:
size of int is 4
size of abc is 64
size of abc[0] is 32
size of abc[0][0] is 4
1abc[0][0]=11
2abc[0][1]=12
3abc[0]=-1074074872
4abc[1]=-1074074840
5*abc=-1074074872
6*abc[0]=11
6*(abc[0]+1)=12
6*(abc[0]+2)=13
7*abc[1]=21
7*(abc[1]+1)=22
7*(abc[1]+2)=23 </span>
8addr of abc=0xbffaeb08
9addr of &abc=0xbffaeb08
10addr of abc[0]=0xbffaeb08
11addr of abc[1]=0xbffaeb28
12addr of &abc[0]=0xbffaeb08
13addr of &abc[1]=0xbffaeb28
14addr of *abc[0]=0xb
15addr of *abc[1]=0x15
16addr of &(*abc[0])=0xbffaeb08
17addr of &(*abc[1])=0xbffaeb28
18addr of abc[0][0]=0xb
19addr of abc[0][1]=0xc
20addr of &abc[0][0]=0xbffaeb08
21addr of &abc[0][1]=0xbffaeb0c
结论:
1)对于二维数组 int abc[2][8],abc[0]和abc[1]是两个子数组名,完全可以当作是指针进行指针操作(指针类型是int)来获得子数组中的任意元素,但是abc这个玩意可就不能当作简单的指针来操作了,具体参看例子结果
2)依然只有sizeof才是识别好基友之间的利器,sizeof 一个明确定义的指针永远是4(具体多少依据当前操作系统),而sizeof一个数组名却可以得到数组的元素实际占用空间