int a[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; int (*prt)[3] = a, *p = a[0];
1. 拆分二维数组
int a[4][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
拆分成:
int b[3] = {1, 2, 3 };
int c[3] = {4, 5, 6 };
int d[3] = {7, 8, 9 };
以“b[3] = {1, 2, 3 }”为例:
b是数组第一个元素的地址,这里b相当于整型指针!上述b,c,d,e都是整型指针。
那么就有:a[4] = { b, c, d, e };
这是一个一维数组,其中的元素都是整型指针。
a是什么?是数组a中第一个元素b的地址!
根据上述这种理解,发现可以很方便的解出这道题。
先看“int ( * prt)[3]=a”,相当于:
int b[3];
int *prt = &b;
即定义了一个指向“数组第一个元素的地址”的指针prt;
而从1,2分析来看,a表示的正是b的地址。所以,这里等价于:prt = a。
A:* (( * prt+1)[2])
*a 即a[0],也就是b;
( b+1) 表示 元素2的地址,也就是a[0][1]的地址;
(b+1)[2] → *( (b+1) + 2 ) = *(b+3) = b[3],越界了!其实就是c[0],VS上验证过,输出也是4.
而答案提供的相当于*(b[3]),连数组元素都算不上!
注:下标和指针转化公式:*(a+n) = a[n]
C:( * prt+1)+2
( * a+1)+2 等价于(b+1) + 2 = b+3,是4的地址,也就是c[0]的地址;同样错误。
不过可以验证*(( * prt+1)+2),输出为4.
int *p = a[0],相当于int *p = b,遇到p直接用b替换就行了!
* (p+5)等价于b[5],也就是c[2],元素6,前面还多个*,所以这个错的也很明显。
数组元素 a[1][2] 可以表示为 *(*(a+1)+2) 或 prt[1][2] 或 p[5],具体解释如下:
因此,a[1][2] 的值为 6。