C语言关于数组元素引用的问题,谢谢达人!

来源:百度知道 编辑:UC知道 时间:2024/07/01 04:33:19
一、int a[5],*p=a+1;对a数组元素内容的正确引用是()
A.&a[5] B.a+2 C.*(p-1) D.*(p+4)
帮忙分析下,答案是选着D。
二、int a[2][3],(*p)[3];p=a;则对a数组元素的正确引用是()
A.(p+1)[0] B.p[1]+2 C.*(*(p+2)+1) D.*(p[1]+1)
答案是选D,,也帮忙分析下。谢谢了@@@!
对于指针和数组元素的引用实在是不了解,所以希望达人们能教下偶啊~~~谢谢咯!!

但我是新人学C语言不知道怎么得的,帮忙

int a[5],*p=a+1,声明了一个int数组a[5],然后声明了一个int指针p,*p=a+1中的a表示数组a[5]中a[0]的地址,a+1表示a[0]地址往后移动一位,也就是a[1]的地址,*p=a+1表示指针p指向了a[1]。
选项A是错误的语法,
选项B的a+2的结果是a[3]的地址,而不是元素内容,是错误的;
选项C的*(p-1)的结果是a[0]的内容;
选项D的*(p+4)得的是a[5]的内容,是错误的;
我认为正确答案是C,你可以上VC++里编个程序看下。

第二题:
int a[2][3],(*p)[3];p=a的意思是声名一个2行3列的数组a,声明一个3维指针p,把数组a[0][0]的地址赋予指针p[0];
选项A语法错误;选项B超出了数组指针的范围;
选项C表示数组a的第3行1列元素,a只有2行3列,超出了范围;其中p+2表示a数组的第3行的地址,*(p+2)+1表示a数组第3行1列元素地址,*(*(p+2)+1)表示3行1列元素内容;超出了a数组的范围.

选项D表示2行2列元素,其中p[1]表示a数组2行1列的地址,p[1]+1表示a数组2行2列地址,*(p[1]+1)表示2行2列元素内容。D选项是正确的

第一个选C吧
*p=a+1;就指向a[1]了 *(p+4)就指向a[5]越界了

第二题
p=a 是指针数组 A B都不是对数组元素的引用,数组元素的引用必须加*
C.*(*(p+2)+1) 指向a[2][1]越界了
a[i][]下标i是0 1 不能是2

第一个答案错,选c,如楼上所说,*(p+4)指向a[5]越界。
第二个正确,(*p)[3]表示p是一个一个指向含有三个元素的数组的指针,三个元素为a[2][3]的矩阵的三个列,
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]
p=a,表示p指向a数组的首地址,答案里A,B不能表示元素内容,只是个地址,c表示第1列的第3行,明显越界了,所以是D

第一题:
A、C