【问题标题】:Why is variable name of array declared on stack not a pointer C++? [duplicate]为什么在堆栈上声明的数组的变量名不是指针 C++? [复制]
【发布时间】:2017-03-01 03:56:31
【问题描述】:

如果我声明两个数组,一个在堆栈上,一个在堆上,我在打印变量名时会得到不同的行为(如果重要,在 gdb 中)。

int array_on_stack[5];

int * array_on_heap = new int[5];

现在在 gdb 中,我单步执行每一行代码,然后打印变量名,期望得到每个代码的内存地址。

print array_on_stack

print array_on_heap

但是对于array_on_stack,它会打印数组的内容而不是内存地址。为了获得内存地址,我需要命令print &array_on_stack。这表明array_on_stack 不是指针。有人能解释一下这两个声明在如何访问它们的内存地址方面的区别以及为什么会这样吗?

【问题讨论】:

  • 那是因为它们不一样,一个是指针,一个是数组;它们是不同的东西。
  • 这表明 array_on_stack 不是指针 你是对的。数组不是指针。指针是指针,数组是数组。就像ints 不是doubles。

标签: c++ arrays pointers heap-memory stack-memory


【解决方案1】:

您的array_on_heap 不是数组:它是一个指针(指向动态分配数组的第一项)。

数组就是数组,指针就是指针。

因此,您将在 gdb 中得到类似的结果

int* array_with_automatic_storage = &array_on_stack[0];

【讨论】:

  • 我认为在 C++ 数组中会降级为指针,因此变量名只是指向第一个对象的指针。这就是为什么我们可以用两种方式声明数组。
  • @xjtc55:是的,在上面的声明中,您可以将&array_on_stack[0] 替换为仅array_on_stack,利用隐式转换为指针,数组表达式/decay/ 到指针类型。但数组表达式并不总是衰减,数组也不是指针。特别是您不能将指针分配给数组变量。
  • 这里有一个关于 SO 的C++ array FAQ 问题,主要由 Fred Overflow 和我编写。你可以做得比阅读它更糟糕。 SO上还有一些C++ array documentation,主要由我创建和编写。我在前面提到作者是常见的披露。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2021-08-22
  • 1970-01-01
相关资源
最近更新 更多