我从来没有读过任何关于像指针这样的解引用数组的东西,我相信它不应该起作用。但是下面的代码确实可以使用 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
它是正确的行为还是只是修复代码的编译器?
我从来没有读过任何关于像指针这样的解引用数组的东西,我相信它不应该起作用。但是下面的代码确实可以使用 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
它是正确的行为还是只是修复代码的编译器?
您不能取消引用数组,只能取消引用指针。
这里发生的是,在大多数情况下,数组类型的表达式被隐式转换为(“衰减”为)指向数组对象第一个元素的指针。所以ar
“衰减”到&ar[0]
; 取消引用为您提供 的值ar[0]
,即int
.
我最近的这个答案详细讨论了 C。C++ 的规则是相似的,但是 C++ 还有一些不发生转换的情况(在你的代码中都没有发生)。
它是正确的。获取并取消引用内存位置,因此前 4 个字节是整数。您可以执行 *(ar+1) 来获取第二个内存位置,取消引用并再次获取前 4 个字节。4 个字节,因为如果您的机器是 32 位并且 sizeof(int) == 4 它是一个 int
我相信这是正确的行为。指向数组的指针总是从数组的头部开始——也就是第一个元素。在这种情况下,这将是“ar[0]”,输出应该是“1”。