指针和二维数组
1.关于二位数组的名字
int array[5][6] = {0};
定义了一个二位数组array
,这个array
是一个指向五个元素的行指针常量。我们知道 *(array+1) == array[1]
代表的是这个二维数组第二行的名字,换句话说,代表的是array[1]这个一维数组的名字,也就是普通的指针常量。注意这里*并没有取值的意思,而只是一个语法糖,把一个行指针常量降级成为了普通指针常量。其实在C语言里面一定要注意一个概念,索引只是指针的语法糖。
2.一道课后题
如果不上机,你能看出下边代码将打印什么值吗?
#include <stdio.h>
int main()
{
int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p)[3] = (int (*)[3])&array;
printf("%d\n", p[2][2]);
return 0;
}
答:9
分析:对于初学者来说,这道题的难度级别很高,但当你尝试去理解它其中的原理之后,你会发现对指针的认识又深入了一点儿呢!
等号右边强制将 array 这个一位数组重新划分成 3 * 3 的二维数组,然后用数组指针指向它(本章最后说如果要使用指针来指向二维数组,只能使用数组指针,还记得吗?)。