首页 > 试题广场 >

已知ii,j都是整型变量,下列表达式中,与下标引用X[ii]

[不定项选择题]
已知ii,j都是整型变量,下列表达式中,与下标引用X[ii][j]不等效的是()。
  • *(X[ii]+j)
  • *(X+ii)[j]
  • *(X+ii+j)
  • *(*(X+ii)+j)
B应该也是错误的,
由于[]的优先级高于*,因此,相当于对地址(X+ii)[j]取值,
如果B改为(*(X+ii))[j]就对了
发表于 2015-08-12 21:18:07 回复(4)
答案:选C
D解释:*(*(X+ii)+j);*(X+1)指向X[ii]这个一维数组,然后+j(加4*j个字节),最后*运算就是输出的就是X[ii][j];
AB其实和D一个意思,*(X+ii)[j]先指向X[ii]这个一维数组的首元素,然后指向这个一维数组里第j+1个元素
编辑于 2016-07-17 15:19:41 回复(0)
a[i][j] =*(a[i]+j) = *(*(a+i)+j) =(*(a+i))[j]
发表于 2017-08-14 16:07:31 回复(0)
***无真相
#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



发表于 2017-02-27 09:17:22 回复(0)
B也是错误的,正确的应该是(*(x+ii))[jj]
发表于 2015-07-31 11:35:18 回复(0)
道理我都懂,但变量命名为什么要多用一个i
发表于 2016-11-17 17:37:11 回复(1)
感觉答案应该是BC,对于B,下标操作符优先,(X+ii)[j]= (X)[j +ii ],让后再对其求解引用是 (X)[j +ii ][0]
发表于 2015-07-10 20:13:27 回复(0)
*(X+ii)[j]
B项是错误的,先说明, x[i] == *(x + i)    因为[]优先级大于* 那么将x+i看成一个整体y同理  *(x+i)[j]  == *(y[j]) == *(*(y+j)) == *(*((x+i) + j)) == *(*(x + i + j)) 现在你看还是正确的吗, B是错误的
发表于 2021-02-07 00:02:52 回复(0)
发表于 2017-06-23 14:44:47 回复(0)
关于B选项解释
因为*(x+i)[j]中 因为[]优先级高于* 
故等价于*(*((x+i)+j))    也即  *(*(x+i+j))取的是第i+j行的首元素的值 
所以不等于第i行第j列的值
测试:

发表于 2020-07-05 15:12:48 回复(1)
答案应该是BC,已经验证过了,B应该是(*(a + ii))[j],因为*的优先级比[]低,*(X+ii)[j]等价于*((X+ii)[j])
发表于 2017-07-25 09:50:08 回复(0)

(p[i]+j)、((p+i)+j)、((p+i))[j]、p[i][j]

编辑于 2020-07-28 14:22:01 回复(0)

参考MarchFour的,选c
编辑于 2020-03-02 23:10:47 回复(0)
留个记号
发表于 2019-11-11 08:09:24 回复(0)
由于[]的优先级高于*,因此,相当于对地址(X+ii)[j]取值,
如果B改为(*(X+ii))[j]就对了
发表于 2019-07-19 18:49:04 回复(0)
箫头像
a[m]相当于*(a+m)就是说 [] 符号如果要去掉的话,相加,括号,再取地址。。。反过来也一样
发表于 2018-04-03 20:04:23 回复(0)
[ ]的优先级高于* 所以 B应该改成(* ( x + i i ) ) [ j ] ;
发表于 2017-02-10 16:31:24 回复(0)

与下标引用X[ii][j]不等效的表达式是选项C,即*(X+ii+j)。

根据C++数组的定义,二维数组可以被视为一系列一维数组的集合,其中每个一维数组都有相同的元素类型和大小。因此,使用下标引用X[ii][j]可以实现以下操作:

cppCopy Code
X[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应该用作二维数组中第一个维度的索引,而不是指针算术运算的操作数。

发表于 2023-10-30 16:39:33 回复(0)
【】的优先级大于*
发表于 2023-09-23 23:27:30 回复(0)
[]优先级高于*
发表于 2023-08-26 14:23:52 回复(0)