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

一、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选项是正确的
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-07-30
第一个选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
第2个回答  2008-07-30
第一个答案错,选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
第3个回答  2008-07-30
第一题:
A、C语言中数组下标从0开始,最多也只能到a[4],所以A错。
B、C语言中数组名是指向第一个元素的指针,所以a+2是指向第3个元素。
C、p是指针,是指向第二个元素,所以*(p-1)是引用第一个元素。
D、p+4超出数组上界,错误
所以应该选择 C

第二题:
分析可以得到p是指向数组的同时也是指向第一行第一个元素的指针,数组应该如下:
* * *
* * *
A、B中不存在取元素操作符肯定错,必须有*操作符。
C、一般来说*(*(p+i)+j)指的是a[i][j],则C为a[2][1],出界了哈,错误
D、p[1]指向第二行第一个元素,所以D是指向第二行第二个元素。
相似回答