#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> main() { int X[3][3] = { { 0, 1, 2 }, { 10, 11, 12 }, { 20, 21, 22 } }; int i = 2, j = 2; printf("X[i][j]=%d\n", X[i][j]); printf("A选项:*(X[i]+j)=%d\n", *(X[i] + j)); printf("B选项:(X+i)[j]=%d\n", (X + i)[j]); printf("C选项:*(X+i+j)=%d\n", *(X + i + j)); printf("D选项:*(*(X+i)+j)=%d\n", *(*(X + i) + j)); printf("B选项修改后:(*(X+i))[j]=%d\n", (*(X + i))[j]); getchar(); } 输出 X[i][j]=22 A选项:*(X[i]+j)=22 B选项:(X+i)[j]=17824708 C选项:*(X+i+j)=17824708 D选项:*(*(X+i)+j)=22 B选项修改后:(*(X+i))[j]=22
与下标引用X[ii][j]不等效的表达式是选项C,即*(X+ii+j)。
根据C++数组的定义,二维数组可以被视为一系列一维数组的集合,其中每个一维数组都有相同的元素类型和大小。因此,使用下标引用X[ii][j]可以实现以下操作:
cppCopy CodeX[ii][j] = *(X[ii] + j) = *(*(X + ii) + j)
选项A和D中的表达式都等效于X[ii][j],它们都是通过对指向X[ii]的指针进行偏移来访问数组元素的。也就是说,*(X[ii]+j)等价于X[ii][j],*(*(X+ii)+j)等价于X[ii][j]。
选项B中的表达式*(X+ii)[j]并不等同于X[ii][j]。注意到在该表达式中,先使用指针算术运算X+ii得到一个指向X[ii]的指针,然后使用下标引用(X+ii)[j]访问该指针所指向的一维数组的第j个元素。这等价于使用指针算术运算*(X[ii]+j),但并不等价于X[ii][j]。
因此,选项C的表达式*(X+ii+j)不等同于X[ii][j]。在这个表达式中,指针算术运算X+ii+j得到的指针指向了一个不存在的地址,因为它将ii和j的值相加,而ii应该用作二维数组中第一个维度的索引,而不是指针算术运算的操作数。