下面这个,我觉得D对,但是不知道c哪里不对,于是上手敲了代码,结果C选项的表达式在不同编译器里面输出的还是不一样的!!
① 在VS Code中,输出的是0,为什么啊?我觉得会返回a[2][1]的,为什么会输出0啊?
② 在VC++ 6.0中,输出的是一个地址,为什么啊?
#include"stdio.h"
int main(){
int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
int (*p)[4]=a;
int i,j,k=0;
printf("%d \n",*(p+2)[1]);
return 0;
}
*(p+2)[1],这个就是随机值,其值是未知的!
[]这个优先级是高于*号的,要想正确访问到元素应该这样(*(p+2))[1]访问到第三行第二个元素
或者*(*(p+2)+1)效果一样
那不是一个有效的地址,所以结果是随机的。
优先级问题导致的访问到没有定义的空间,而0的话是恰巧,就是一个随机值
【以下回答由 GPT 生成】
答案:
在C语言中,数组名本身可以被解释为指向该数组首元素的指针。因此,a
在表达式中可以被解释为指向a数组第一行的指针。在这个例子中,p
是一个指向有4个整数的数组的指针,指向a第一行。
在这段代码中,*(p+2)[1]
的意思是先将p
右移两行,然后取第三行的首元素(也就是数组{8,9,10,11}
的首元素),最后得到该元素的值。
然而,在C语言中,优先级规则使得数组下标操作符[]
比指针引用操作符*
的优先级更高。因此,*(p+2)[1]
会被解释为*((p+2)[1])
,先将p
右移两行,然后取第三行的首元素,这个元素是一个数组,因此它会被解释为指向这个数组的指针。最后,表达式取这个指针的值,也就是输出指向数组的地址。
在不同编译器中,优先级的解释可能会有所不同,这导致了不同编译器中代码的输出结果不一致。
为了解决这个问题,可以使用括号明确指定运算的优先级,将表达式改为*(*(p+2)+1)
,这将首先将p
右移两行,然后取第三行的首元素,最后取该元素的值。这样就能获得期望的结果。
以下是修复后的代码:
#include<stdio.h>
int main(){
int a[3][4]={ {0,1,2,3},{4,5,6,7},{8,9,10,11}};
int (*p)[4]=a;
int i,j,k=0;
printf("%d \n",*(*(p+2)+1));
return 0;
}
希望能解决你的问题!如果有任何其他问题,请随时问我。
【相关推荐】