1、定义
定义二维数组的一般格式为:
元素数据类型说明 数组名[常量表达式1][常量表达式2];
例如: int x[10][8];
2、数组名代表数组元素首元素的地址
“数组名代表数组元素首元素的地址”既适用于一位数组,也适用于二维数组。
对于一维数组int a[5]而言,数组名a就表示首元素a[0]的地址,即数组名a等价于&a[0];
对于二维数组int a[2][5]而言,数组名就表示首元素a[0]的地址,即数组名a等价于&a[0]。
接着看a[0],此时的a[0]有两重身份:在二维数组的第一个维度里a[0]是数组的首元素;而在第二维度里,a[0]本身就是个数组,该数组的首元素是a[0][0],所以此时a[0]代表一个数组名。
通过“数组名代表数组元素首元素的地址”可知,a[0]等价于&a[0][0]。而前面同时有a等价于&a[0]的结论,所以可以得到a等价于&&a[0][0]。
3、指针访问二维数组的两种方式
普通指针指向二维数组的第一维:
int a[2][5];
int *p1 = a[0];
int *p2 = a[1];
printf(“a[0][0] = %d.\n”,*p1); //a[0][0]
printf(“a[0][1] = %d.\n”,*(p1+1)); //a[0][1];
printf(“a[1][1] = %d.\n”,*(p2+1));
数组指针访问二维数组:
int a[2][5];
int (*p)[5] = a;
printf(“a[0][0] = %d.\n”,**p);
printf(“a[0][4] = %d.\n”,*(*p+4));
printf(“a[1][4] = %d.\n”,*(*(p+1)+4));
总结:
1、a[i][j] 等同于 ((p+i) + j);
2、p不解引用,对p加减是在第一维里编译地址
3、p解一次引用,对p加减是在第二维里编译地址
4、p解二次引用,才能访问到值,如*(*p);