问题描述
我无法预测该问题的答案,也无法从逻辑上获得解决方案?尽管它可能有点简单,但是作为一个初学者,我无法获得它?
int main()
{
int array[5][5];
printf("%d",( (array == *array) && (*array == array[0]) ));
return 0;
}
解决方法
基本上是一个简单的解决问题。
-
array
的地址与*array
的地址相同吗? (是的,尽管它们的类型不同-不同的数组) -
*array
的地址是否与array[0]
的地址相同? (是的,它们是相同的-array
中的第一个int数组) - 现在
1 && 1
的值为1(布尔条件的值为1或0)
PS。正如@Lundin所说,此问题无效C
, array
是数组开头的地址。
*array
是数组第一行开头的地址。这也是数组的开始。这就是为什么它们相等的原因。
array[0]
是二维数组的第一个元素,因此它是数组的第一行。这就是array[0]
和*array
相等的原因。
由于两个比较结果均为1,所以结果总计为1。
编辑: 看一下阵列的可视化。每个“单元”都有自己的地址,每行从左到右递增。 数组开头的地址与第一行开头的地址完全相同。两个地址都指向同一个单元格。
,-
array
在表达式中使用时衰减为类型int (*)[5]
。 -
*array
的类型为int*
。
这些不是兼容的指针类型。 ==
的指针操作数的要求是(C17 6.5.9):
约束
/-/
—两个操作数都是指向兼容类型的合格或不合格版本的指针;
因此,array == *array
不是有效的C,它违反了约束。因此,它不会提供确定性的输出,并且如果您从此代码中获得可执行文件,则任何人都猜测它会做什么。总体上,猜测“不是C的代码”的作用是毫无意义的。充其量是存在一些非标准的编译器扩展。
“但是它可以编译”-不,它不能干净地编译,请参见What must a C compiler do when it finds an error?
*array
和array[0]
的含义相同,您可以比较int*
个操作数。