C语言的指针方面的几道题请解释一下

来源:百度知道 编辑:UC知道 时间:2024/05/22 08:04:06
1若有说明inta[4][4]={8,4,5,6,9,3,7},*p=a[0];,则对数组元素a[i][j](其中0<=i<6,0<=j<4)之值的正确引用为( C )
A *(*(p+i)+j B *(p[i]+j) C p[i*4+j] D *(a[i]+j)
2若有说明inta[6][3]={1,2,3,4,5,6,7,8},*p=a[0];则对数组元素a[i][j](其中0<=i<6,0<=j<3)之地址的正确引用为( B )
A *(p+i)+j) B*(a+i)j C &p[i][j] D p[i]+j
3若有说明inta[3][4]={3,9,7,8,5},(*p)[4];和赋值语句p=a;则下述数组元素a[i][j](其中0<==i<3,0<=j<4)之值的正确引用为( D )
A *(p+i)[j] B *p[i][j] C *(*p[i]+j) D *(*(p+i)+j)
4若有说明inta[5][4],(*p)[4];和赋值语句p=a;则下述对数组元素a[i](其中0<=i<5,0<=j<4)的输入语句中正确的是( D )
A scanf("%d",*(a[0]+i)+j) B scanf("%d",*p[i]+j) C scanf("%d",p[i][j
]) D scanf("%d"p[i]+j)
5若有说明intb[4][3]={3,5,7,9,2,8,4,1,6},*p[4];和赋值语句p[0]=b[0];p[1]=b[1];p[2]=b[2];p[3]=b[3];则下述对数组元素b[i][j](其中0<=i<4,0<=j<3)的输出语句中不正确的是( C )
A printf("%d\n",*(p[i]+j) B printf("%d\n",p[i]+j) C printf("%d\n",*(p+i)[j]) D printf("%d\n

1.首先这里所谓的2维数组,在内存中是按照一维数组方式来存放的,所以这里int a[4][4]可以理解成int a[16],*p又是指向a的指针,所以C是正确的。对于A是指针的指针的了,明显是错误的。B,D和A是一样的。因为*(p+i)和p[i和]a[i]等价

2.答案B应该为*(*(a+i)+j)或者*(a+i)[j] ,也同等于*(a[i]+j),同等于a[i][j],同等于*(*(p+i)+j),所以A错误。对于C和D没有这种用法……

3.(*p)[4]是个指针数组。A和C都把它当做数组指针来用了,所以错了,B的话,没这个用法……。D是正确的

4.这个题和第三题是一样的。

5.答案应该是B。C的*(p+i)[j]等价于p[i][j],A的也等价于p[i][j],所以ACD是正确的,所以应该选B

6.这个题和第五题一样的。对b[i][j]值的引用是*(p[i]+j),所以它的地址是存放在p[i]+j里面的。所以选B。对于A。。这个在修改地址,明显不对,C是地址的地址也不对,D和C一个道理。答案是B

答案全部是对的
1 p是一个一维指针 指向数组a
2 *(*(a+i)+j)是指a[i][j]的值 至于去掉一个星号 当然是取地址的意思啦
3 p是一个数组指针 指向数组的
4 scanf 语句中的后面要用地址 p[i]+j就是取地址
5 选B *(p+i)[j]等价于p[i][j],*(p[i]+j) 等价于p[i][j]
6 C的是地址的地址 不对
p[i]+j是p[i][j]的地址

4若有说明inta[5][4],(*p)[4];和赋值语句p=a;则下述对数组元素a[i](其中0<=i<5,0<=j<4)的输入语句中正确的是( D )
A scanf("%d",*(a[0]+i)+j) B scanf("%d",*p[i]+j) C scanf("%d",p[i][j
]) D scanf("%d"p[i