C++ C++;解引用数组

C++ C++;解引用数组,c++,arrays,dereference,C++,Arrays,Dereference,我从来没有读过关于取消引用数组(如指针)的任何文章,我认为这不应该起作用。但以下代码在使用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 intar[9]{1,2,3,4,5,6,7,8,9}; 这是正确的。 获取并取消引用内存位置,因此前4个字节为整数。 您可以执行*(ar+1)来获取第二个内存位置,取

我从来没有读过关于取消引用数组(如指针)的任何文章,我认为这不应该起作用。但以下代码在使用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
intar[9]{1,2,3,4,5,6,7,8,9};
这是正确的。
获取并取消引用内存位置,因此前4个字节为整数。
您可以执行*(ar+1)来获取第二个内存位置,取消对该位置的引用并再次获取前4个字节。

4字节,因为如果您的机器是32位且sizeof(int)==4,则它是int。我相信这是正确的行为。指向数组的指针总是从数组的头开始——这是第一个元素。在这种情况下,它将是“ar[0]”,输出应该是“1”。

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

这里发生的事情是,在大多数上下文中,数组类型的表达式隐式转换为指向数组对象的第一个元素的指针(“decadys”to)。因此,
ar
“衰减”为
&ar[0]
;解引用,它将为您提供
ar[0]
的值,这是一个
int


< C++ >详细讨论了这一点。C++的规则是相似的,但是C++有一些不发生转换的情况(在代码中没有发生)。code>ar
衰减为指向数组第一个元素的指针。有些人在循环中使用*(ar++),就像你可以使用整数来跟踪数组的位置一样,[]是一种很好的方法*(ar+索引)可以工作too@juanchopanza谢谢。@Alexandru Barbarosie我几周前开始读编程书,所以我不应该知道,在谷歌上搜索也没有返回答案。@demonofnight:在这种情况下,你不能使用
*(ar++)
。这只适用于指针,而不适用于实际数组。这是因为它需要从该位置读取4个字节(32位整数),因为它是一个整数,如果它是一个字符,则只有一个字节。32位内存指针也有4个字节。如果我说错了什么,请纠正我,我已经玩了一段时间了。不正确的是你假设一个
int
必须有4个字节。大小不能保证是4,也可以是2或8(通常是4,但这不是规则)。正确的公式是它读取
sizeof(int)
bytes。要真正学究一点,
sizeof(int)==4
并不一定意味着它是32位
sizeof
是以字节为单位的大小,一个字节必须至少为8位,但可以更大<在
中定义的code>CHAR\u BIT告诉您一个字节中的位数。(你不太可能在一些外来的嵌入式系统,特别是DSP之外找到
CHAR\u BIT!=8
)这就是为什么我说32位和sizeof=32你可以把“一个int作为一个字符,限制在0到255之间”我知道你可以有一个小于32位的int:)。如果我错了,请纠正我,但是c/c++中的数组并不总是一个指针?数组本身不是,而是创建数组时c/c++中的变量接收和地址。似乎每次创建数组时都会发生这种情况,我知道数组是顺序内存区域中的元素序列。但是变量接收第一个元素的地址,这就是我对指针的意思。左侧变量始终接收内存中第一个对象的内存地址array@demonofnight,我不确定你指的是哪个变量,但只有当它衰减时。例如,
sizeof(ar)
不会导致任何衰减。@demonofnight:正如我所说,在大多数上下文中,数组类型的表达式(包括但不限于数组对象的名称)会隐式转换为指针值。某些情况下,当它是一元
&
sizeof
运算符的操作数时,不会发生这种情况。创建数组时不会发生这种情况,只有当表达式引用数组时才会发生这种情况。数组表达式的数组到指针的转换对它可能引用的任何数组对象都没有影响。