如果数组的元素又是数组,则称为二维数组。例如
int a[3][4] = {
{0, 1, 2, 3}
, {4, 5, 6, 7}
, {8, 9 ,10 ,11}
};
可以将a
看成一个数组,这个数组中有
3
个元素,每个元素又是一个包含
4
个
int
的数组。
1 二维数组的标识符
当给出二维数组名而没有方括号时,可以将其看作是二维数组的标识符。该标识符不是左值,不能给它赋值,可以将其看作是数组的起始地址,即数组中第一个元素的地址。
2 a[x]的含义
x是非负整数。在之前提到,二维数组可以看成是数组的数组,所以a[0]表示二维数组中的第一个元素,a[1]表示二维数组中的第二个元素,而二维数组中的元素类型还是素组,所以a[0]表示数组{0, 1, 2, 3}的地址,a[1]表示数组{4, 5, 6, 7}的地址。
int a1 = *(a[0]+1);
int a2 = *(a[1]+2);
此时,a1
的值是
1
,
a2
的值是
6
,如图
1
所示。
图1 a[x]的含义
3 a+x的含义
x是非负整数。a是指向其第一个元素,则a+1指向其第二个元素,a+2指向其第三个元素,如图2所示。
图2 a+x的含义
对于二维数组a,a和a[0]的值都是表示数组a的第一个元素的地址。而a、a+1和a+2的类型都是二维数组,所以a+1和(a+1)[0]的值都是表示a+1的第一个元素的值。
int b1 = *(a+1)[0];
int b2 = *(a+1)[1];
此时b1
的值是
4
,
b2
的值是
8
。
4 (a+x)[y]的含义
x和y都是整数,在“3 a+x的含义”中提到,a+x的含义是指向二维数组的第x-1个元素,而a+x的类型仍然是二维数组,所以(a+x)[y]的表示二维数组中第y-1个元素。
int b3 = *((a+1)[0]+1);
b3
的值是
5
,如图
3
所示。
图3 (a+x)[y]的含义
4 定义指向数组的指针
定义数组的指针与定义数组类似,首先声明元素类型,之后是变量名字和维数。因为定义的类型是指针,所以需要在标识符前加上*。
int (*ip)[4] = &a[2];
需要注意的是,方括号[]
的优先级别高于
*
,所以在定义数组的指针时,必须加上小括号来设置优先级。如果不加入小括号设置优先级
int *ip[4];
此时ip
表示一个数组,该数组中包含
4
个元素,每个元素的类型是
int*
。