5

我从来没有读过任何关于像指针这样的解引用数组的东西,我相信它不应该起作用。但是下面的代码确实可以使用 QT Creator 和 g++ 4.8:

int ar[9]{1,2,3,4,5,6,7,8,9};
cout << *ar << endl; //prints the first element of ar

它是正确的行为还是只是修复代码的编译器?

4

3 回答 3

4

您不能取消引用数组,只能取消引用指针。

这里发生的是,在大多数情况下,数组类型的表达式被隐式转换为(“衰减”为)指向数组对象第一个元素的指针。所以ar“衰减”到&ar[0]; 取消引用为您提供 的值ar[0],即int.

我最近的这个答案详细讨论了 C。C++ 的规则是相似的,但是 C++ 还有一些不发生转换的情况(在你的代码中都没有发生)。

于 2013-07-08T18:21:11.440 回答
1

它是正确的。获取并取消引用内存位置,因此前 4 个字节是整数。您可以执行 *(ar+1) 来获取第二个内存位置,取消引用并再次获取前 4 个字节。4 个字节,因为如果您的机器是 32 位并且 sizeof(int) == 4 它是一个 int

于 2013-07-08T18:06:16.063 回答
0

我相信这是正确的行为。指向数组的指针总是从数组的头部开始——也就是第一个元素。在这种情况下,这将是“ar[0]”,输出应该是“1”。

于 2013-07-08T18:14:58.500 回答