首页 > 试题广场 >

若已有定义和说明:int a[2][3],(*p)[3];p

[单选题]

若已有定义和说明:int a[2][3],(*p)[3];p=a;,则对a数组元素地址正确引用的是(   )。

  • *(p=2)
  • (p+1)+2
  • p[1]+1
  • p[2]
选C
p是指向数组的指针,每个数组有三个int元素,
即p[0] 和 a[0][1], a[0][2],a[0][3] 表示一个空间
即p[1] 和 a[1][1], a[1][2],a[1][3] 表示一个空间
同时本题目问哪个选项能命中a数组中的元素
A是把索引2赋值给p,然后取内容,问题是系统地址为2并不一定是a数组的地址,因此不能选。
B是p当前地址+3,因为p=a,初始值指向a数组第一行第一列a[0][0],但是a数组不一定两行的地址是顺序排列的,因此p+2还能命中a[0][3],p+3就不一定指向什么位置了。
C是p[1]+1表示a[1][1]是在a数组内的,所以命中,即正确选项。
D是p[2],不能与a数组命中,p[0]和p[1]命中a数组的两行,p[3]就不知道指向什么位置了

发表于 2021-10-24 16:20:50 回复(4)
B如果是*(p+1)+2就对了,
发表于 2019-07-04 08:20:55 回复(5)

int a[3][6] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//与下面等同
int a[3][6] = {
		{1,2,3,4,5,6},
		{7,8,9,10,11,12},
		{0,0,0,0,0,0},
	};
//a:代表第0行的行地址,与第0行首元素地址的值相同,但步长不一样
//a+i <=> &a[i]:代表第i行的行地址
//*(a+i) <=> a[i]:代表第i行的首元素地址;a+i为第i行行地址,解引用为第i行首元素地址
//*(a+i)+j: <=> &a[i][j]:代表第i行第j列元素的地址
//*(*(a+i)+j) <=> a[i][j]:第i行第j列元素的值

cout << *(a[0] + 1) << endl;//2
cout << *((*a)+1)<< endl;//2
	
cout << (*a[1] + 1) << endl;//8
cout << *(*(a + 1) + 1) << endl;//8

//a代表首行地址,*a解引用为该行首元素地址,**a再解引用为元素值
//a+1为下一行的行地址,解引用为该行首元素地址,再解引用为元素值
//‘*’解引用的优先级高于‘+’号
//*a+1为先解引用得到首行首元素地址,首元素地址+1为首行第2个元素的地址
//*(a+1)为先让首行地址加1,得到下一行行地址,再解引用为下一行首元素的地址
cout << a << " " << *a << " " << **a << endl;//a与*a值相等,但含义不一样,一个为行地址,一个为元素地址
cout << *a + 1/*首行第2个元素的地址*/ << " " << *(a + 1)/*下一行首元素的地址*/ << endl;
cout << *(*a + 1)/*2*/ << " " << *(*(a + 1))/*7*/ << endl;

发表于 2022-03-23 14:53:00 回复(0)
做这种题,脑海一定要有图。二维数组实质上是 一个一维数组,只不过这个一维数组里面每个元素都是一个数组。
所以a是这个大数组的首地址,p也是用于遍历这个大数组的指针,我们称为行指针。
故B选项:(p+1)+2:这个意思是p+3,即拿到二维数组第四排数组的首地址。
B选项改成:*(p+1)+2这个就没有问题了。
C选项:p[1]是第二排的一维数组的首地址。p[1]+1即第二排一维数组第一个元素的地址,没有问题。
A选项显然错误
D选项p[2]指的是二维数组第三排的首地址
发表于 2021-12-06 16:39:07 回复(0)
此处p[0]、p[1]均为指针,其分别与a[0]、a[1]指向同一内存;
且*(p+1)=p[1],则*(p+1)+2=p[1]+2,指向二维数组的第六个元素;
这里让我有些迷惑的是,p为一维数组的指针,但*p在这里依旧为指针;
我的想法是,数组名称可看作指针,而p在此处为指向数组名称的指针,即p为二级指针;
发表于 2020-03-12 22:06:07 回复(0)
P大披让人迷惑
发表于 2021-03-04 17:52:37 回复(0)

若已有定义和说明:int a[2][3],(*p)[3];p=a;,则对a数组元素地址正确引用的是(   )。

  • *(p=2)
  • (p+1)+2
  • p[1]+1
  • p[2]
A选项,p是一个数组指针,将2作为地址赋给p,再解引用,首先做法肯定不是,其次,结果未必是数组某个元素的地址。但能肯定是一个地址,因为p是行指针,*p 表示列指针。
B选项,二维数组物理上是顺序存储的,只是分析的时候习惯将他理解为几行几列,B选项p是数组指针类型,p+3实际上是指针偏移了三行所以错误。
C选项,p[1] == a[1],a[1]是第二行一维数组的数组名,也就是第二行一维数组的首元素地址,即&a[1][0],加1,自然就是第二行一维数组的第二个元素的地址,即&a[1][1]。
D选项,p[2] == a[2],二维数组访问越界了。
发表于 2023-04-29 13:53:35 回复(0)
(*p)[3]是一个指向具有三个元素的一维数组的指针
P[1]+1是指向二维数组第二行第二列的元素
发表于 2018-04-11 21:25:59 回复(0)
C (*p)[3]是一个指向具有三个元素的一维数组的指针 C选项的意思是指向二维数组第二行第二列的元素
发表于 2017-08-12 12:17:24 回复(0)
大小写不用区分吗????CD不是大写的P吗
发表于 2019-12-06 13:12:02 回复(0)
B比C更合适
发表于 2022-04-04 15:32:29 回复(0)
int(*p)[3]是一个指向具有三个int元素的一维数组的指针。
很明显,
  • p[1]+1
C选项代表a[1][1]
发表于 2021-11-08 21:25:22 回复(0)
这个题有问题吧,不区分大小写么,编译都不过
发表于 2021-03-31 20:33:53 回复(0)
这个题不是问的“则对a数组元素地址正确引用的是(   )。”是问的地址吧? 不是元素值?
发表于 2020-01-29 11:03:10 回复(2)
C
p[1]+1是取a的第二行在进行列+1,即第二行第二列元素
发表于 2017-10-11 13:28:40 回复(0)
选C
p[1]+1指向了二维数组a的第二行第二个元素,其它不正确

发表于 2016-11-30 23:18:05 回复(3)