|
5鱼币
先看原题代码:
#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,答案解释关键的一句: int (*p)[3] = (int (*)[3])&array; 等号右边强制将 array 这个一维数组重新划分成 3 * 3 的二维数组,然后用数组指针指向它。
这里我还是不理解, (int (*)[3])是怎样把强制将 array 这个一维数组重新划分成 3 * 3 的二维数组的?
如果说解释是:&array代表一个9个元素的一位数组整体的地址,所以前面的[3]把这个一位数组三等分了?但后面说用数组指针指向它,也就是p指向的是一个二维数组,那么p的值是二维数组的地址还是二维数组第一个一维元素的地址?
正常来讲,我们定义一个指向2维数组的指针写法是:
int (*p)[3][3] = &array;(此处array是一个3*3二维数组的名字)
然后用数组的方式表达最后一个元素应该是p[0][2][2],但原题目中的输出是p[2][2],这说明原题中的P指向的是二维数组的第一个一维元素的地址,而不是指向这个二维数组。
感觉这里还是有点混乱,跪求大神指点,越详细越好,谢谢! |
|