在C++中,二维数组可以通过数组名加下标的方式访问,也可以通过指针运算来访问。对于声明为int a[3][4];的二维数组,a是一个指向数组第一行的指针,而a[i](其中i是小于3的非负整数)是指向数组第i+1行的第一个元素的指针。
我们逐个分析每个选项:
A.*(a[2]+1)
这里a[2]表示数组的第三行(因为数组下标从0开始),a[2]+1是第三行第二个元素的地址,因此*(a[2]+1)解引用该地址得到的是a[2][1]的值,所以这个表达式等价于a[2][1]。
B.a[9]
这个选项假设了一个线性的内存布局,但由于a是一个二维数组,直接使用a[9]试图访问数组元素将会产生编译错误,因为a被视为一个包含三个元素的数组,每个元素都是一个包含四个整数的数组。因此,a[9]超出了数组a的第一维度的范围。
C.*(a[1]+2)
这里a[1]指向数组的第二行,a[1]+2是第二行第三个元素的地址,因此*(a[1]+2)解引用该地址得到的是a[1][2]的值,而不是a[2][1]。
D.*(*(a+2))+1
这个表达式实际上有两个错误。首先,*(a+2)取得的是第三行的首地址,然后再次解引用得到的是a[2][0]的值,即第三行第一个元素的值。最后,+1是对该值进行加法操作,而不是对地址进行操作,所以*(*(a+2))+1计算的是a[2][0]的值加1,而不是a[2][1]的值。