#include<stdio.h>
int main()
{
int a[3][4] = {0};
return 0;
}
如上创建了一个整形元素的二维数组,三行四列,并且元素均初始化为0。
在做一些练习题之前我们先明晰一些二维数组的概念:
不同的人对二维数组的理解可能并不一致,这里分享一种常见的理解方法:
将二维数组看作每个元素都是一个一维数组的一维数组。
例如上边的例程 int a[3][4] 这里我们首先将该数组的 “行” 看作数组的元素个数,“列”看作每个元素的内容,即:
[3]:该数组有三个元素 [4]:每个元素是一个有四个整形的一维数组
每个元素是一个整形,数组int [4]是数组类型,那数组名是什么呢?答案是:下标
所以如果我们想找到第一行第二列的元素,那么可以表示为:a[0]+1,a[0]即是数组名(将二维数组看作一维数组时的第一个元素),数组名是首元素地址,首元素地址加一就得到了第二个元素地址。
这样的理解方式用运算也是完全没有问题的:
1、sizeof(a[0]) -- a[0]是数组名,sizeof(数组名)计算整个数组的大小,4*4=16
2、&a[0] -- &数组名 取出整个数组的地址,在值上与首元素地址相同,但是+1或-1跳过的是整数组大小的地址
下面有一些简单的运算来帮助我们理解该二维数组的含义:
1、printf("%d\n",sizeof(a));
解析:
a是该二维数组的数组名,前面的文章也说过,当数组名传给sizeof时,sizeof计算的是整个数组的大小,该数组为整型数组,每个元素大小为4个字节,三行四列则为12个元素,12*4=48。
答案:48
2、printf("%d\n",sizeof(a[0][0]));
解析:
a[0][0]我们通常理解为第一行第一列的元素,这一点应该没有争议,所以整形元素大小为4,所以答案为4.
答案:4
3、 printf("%d\n",sizeof(a[0]));
解析:
将该二维数组看作元素为一维数组的一维数组,a[0]就是第一个元素,也就是数组名,sizeof(数组名)计算整个数组的大小,4*4=16
答案:16
4、 printf("%d\n",sizeof(a[0]+1));
解析:
同理,a[0]是首元素地址,因为没有&符号,所以+1就是向后移动一个整形,指向了第二个元素(第一行第二列),但是其本质还是一个地址,地址的大小为4或者8
答案:4/8
5、 printf("%d\n",sizeof(a+1));
解析:
这里因为我们把该二维数组当作一维数组了,所以a此时就是数组名,即首元素a[0]的地址,a+1就是a[1]的地址,地址的大小为4或8。
答案:4/8
6、 printf("%d\n",sizeof(*(a+1)));
解析:
相对于5来说,此时只是加了解引用,因为a+1是a[1]的地址,解引用拿到的就是a[1]这个数组,该数组有4个int类型元素,4*4=16.
答案:16