请各位帮我解释下几道C语言选择题

来源:百度知道 编辑:UC知道 时间:2024/05/17 12:52:11
1.如下程序段:
static int m[3][4]={1,2,3,4,5,6,7,8};
int *p=&m[0][0];
printf("%d",*(p+1)[1]);
则下列说法中正确的是( 答案是A )。//请解释最后一句是什么意思
A、输出结果为:0 B、 输出结果为:6
C、 输出结果为:0,6 D、 将输出数据元素的地址而不是数据元素的值。

2.下面程序段的输出为( 答案是A )。
static int m[9]={1,2,3,4,5,6,7,8,9};
int * p[3];
for(int k=0;k<3;k++)
p[k]=m+k*3; //这里是不是把m数组强行赋给p指针数组啊?
printf("%d\n",p[1][2]);
A、 6 B、 4
C、3 D、 格式不正确

3.若有以下说明,并且0≤i<10,则( 答案是C )是对数组元素的错误引用。
int a[]={1,2,3,4,5,6,7,8,9,10},*p=a,i;
A、 *(a+i) B、 a[p-a+i]
C、 p+i D、 *(&a[i]) //这道题就解释选项各是什么意思就行了

---------------------------
就这三道题不完全懂.
请各位帮下我,我是刚学的

第一题实际中应该编译不通过,我认为题目错了
首先,静态二维数组初始化时空的自动初始为0
指针p指向数组m第一个元素的地址,那么*(p+1)就是m[0][1]
*(p+1)[1]是在解释不通
建议编译一下试试

第二Int *p[3];是一个指针数组,下面通过指向就演化为一个二维数组,如下
for(int k=0;k<3;k++)
p[k]=m+k*3;
这个是p[0],p[1],p[2]指向m[0],m[3],m[6];所以p[1][2]等价于m[1*3 + 2]=m[5]=6

第三,A *(a+i)等价于a[i]
B a[p-a + i],a,p都为指针地址,p-a=0 等价于a[i]
C p+i p为地址*(p+i)正确
D *(&a[i]) &a[i]是第i个元素的取地址,加*为指向该元素的指针

楼上解释正确。第一题编译错误,提示printf类型不匹配。

第一题题目是错了,指针p应该定义为int (*p)[4],这样结果就对了。我刚刚回答这个问题写好了结果掉线了,郁闷~~