与c中的数组有关的指针问题的输出是什么,为什么?

问题描述

我无法预测该问题的答案,也无法从逻辑上获得解决方案?尽管它可能有点简单,但是作为一个初学者,我无法获得它?

int main()
{
    int array[5][5];
    printf("%d",( (array == *array) && (*array == array[0]) ));
    return 0;    
}

解决方法

基本上是一个简单的解决问题。

  1. array的地址与*array的地址相同吗? (是的,尽管它们的类型不同-不同的数组)
  2. *array的地址是否与array[0]的地址相同? (是的,它们是相同的-array中的第一个int数组)
  3. 现在1 && 1的值为1(布尔条件的值为1或0)

PS。正如@Lundin所说,此问题无效C

,

array是数组开头的地址。 *array是数组第一行开头的地址。这也是数组的开始。这就是为什么它们相等的原因。

array[0]是二维数组的第一个元素,因此它是数组的第一行。这就是array[0]*array相等的原因。

由于两个比较结果均为1,所以结果总计为1。

编辑: 看一下阵列的可视化。每个“单元”都有自己的地址,每行从左到右递增。 数组开头的地址与第一行开头的地址完全相同。两个地址都指向同一个单元格。

enter image description here

,
  • array在表达式中使用时衰减为类型int (*)[5]
  • *array的类型为int*

这些不是兼容的指针类型。 ==的指针操作数的要求是(C17 6.5.9):

约束
/-/
—两个操作数都是指向兼容类型的合格或不合格版本的指针;

因此,array == *array不是有效的C,它违反了约束。因此,它不会提供确定性的输出,并且如果您从此代码中获得可执行文件,则任何人都猜测它会做什么。总体上,猜测“不是C的代码”的作用是毫无意义的。充其量是存在一些非标准的编译器扩展。

“但是它可以编译”-不,它不能干净地编译,请参见What must a C compiler do when it finds an error?

*arrayarray[0]的含义相同,您可以比较int*个操作数。