为什么 arr 和 &arr 是一样的?

新手上路,请多包涵

从事c/c++编程多年,但今天的意外发现让我有些好奇……为什么下面的代码中两个输出都产生了相同的结果? ( arr is of course the address of arr[0] , ie a pointer to arr[0] . I would have expected &arr to be the adress of该指针,但它具有与 arr 相同的值

  int arr[3];
  cout << arr << endl;
  cout << &arr << endl;

备注:此问题已关闭,但现在又打开了。 (谢谢 ?)

我知道 &arr[0]arr 评估为相同的数字,但这 不是 我的问题!问题是为什么 &arrarr 评估为相同的数字。如果 arr 是文字(未存储任何软件),那么编译器应该抱怨并说 arr 不是左值。如果 arr 的地址存储在某个地方,那么 &arr 应该给我那个位置的地址。 (但这种情况并非如此)

如果我写

常量 int* arr2 = arr;

然后 arr2[i]==arr[i] 对于任何整数 i ,但是 &arr2 != arr

原文由 ragnarius 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 686
2 个回答

他们不一样。它们只是位于相同的内存位置。例如,您可以写 arr+2 来获取 --- arr[2] --- 的地址,但不能写 (&arr)+2 来做同样的事情。

此外, sizeof arrsizeof &arr 是不同的。

原文由 Mr Lister 发布,翻译遵循 CC BY-SA 3.0 许可协议

#include <cassert>

struct foo {
    int x;
    int y;
};

int main() {
    foo f;
    void* a = &f.x;
    void* b = &f;
    assert(a == b);
}

同理,上面的两个地址 ab 是一样的。对象的地址与其第一个成员的地址相同(但是它们的类型不同)。

                             arr
                      _______^_______
                     /               \
                    | [0]   [1]   [2] |
--------------------+-----+-----+-----+--------------------------
      some memory   |     |     |     |        more memory
--------------------+-----+-----+-----+--------------------------
                    ^
                    |
           the pointers point here

正如您在此图中看到的,数组的第一个元素与数组本身位于相同的地址。

原文由 R. Martinho Fernandes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题