首页 > 试题广场 >

(C++部分)声明语句为int a[3][4]; 下列表达式

[单选题]
(C++部分)声明语句为int a[3][4]; 下列表达式中与数组元素a[2][1]等价的是
  • *(a[2]+1)
  • a[9]
  • *(a[1]+2)
  • *(*(a+2))+1
a[i][j] =*(a[i]+j) = *(*(a+i)+j) =(*(a+i))[j]
发表于 2020-08-09 10:50:03 回复(2)
a[2]即为a[2][0]的地址,a[2]+1即a[2][1]的地址,所以*(a[2]+1)=a[2][1]
发表于 2021-05-21 10:32:22 回复(0)

在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]的值。

编辑于 2023-12-05 19:46:14 回复(0)
a[i] = *(a+i)
编辑于 2023-12-21 23:50:36 回复(0)