我已经编程c/c++很多年了,但是今天的偶然发现让我有些好奇...为什么下面的代码中两个输出产生相同的结果? (arr
当然是地址arr[0]
,即指向arr[0]
。我本来期望&arr
是该指针的地址,但它具有相同的值arr
)
int arr[3];
cout << arr << endl;
cout << &arr << endl;
备注:该问题已关闭,但现在再次打开。 (谢谢 ?)
我知道&arr[0]
and arr
评估为相同的数字,但那就是not我的问题!问题是为什么&arr
and arr
计算结果为相同的数字。如果arr
是一个文字(不存储任何软件),那么编译器应该抱怨并说arr
不是左值。如果地址为arr
然后存储在某处&arr
应该给我那个位置的地址。 (但这种情况并非如此)
如果我写
常量 int* arr2 = arr;
then arr2[i]==arr[i]
对于任意整数i
, but &arr2 != arr
.
#include <cassert>
struct foo {
int x;
int y;
};
int main() {
foo f;
void* a = &f.x;
void* b = &f;
assert(a == b);
}
出于同样的原因,这两个地址a
and b
above 是相同的 http://ideone.com/FlOVt。对象的地址与其第一个成员的地址相同(但是它们的类型不同)。
arr
_______^_______
/ \
| [0] [1] [2] |
--------------------+-----+-----+-----+--------------------------
some memory | | | | more memory
--------------------+-----+-----+-----+--------------------------
^
|
the pointers point here
正如您在此图中看到的,数组的第一个元素与数组本身位于同一地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)