为什么在堆栈上声明的数组的变量名称不是指针C++?

xjt*_*c55 2 c++ arrays heap stack pointers

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

int array_on_stack[5];

int * array_on_heap = new int[5];
Run Code Online (Sandbox Code Playgroud)

现在在gdb中,我逐步执行每行代码,然后打印变量名,期望获取每个代码的内存地址.

print array_on_stack

print array_on_heap
Run Code Online (Sandbox Code Playgroud)

但是array_on_stack它打印数组的内容而不是内存地址.为了获取内存地址,我需要命令print &array_on_stack.这表明这array_on_stack不是一个指针.有人可以解释这两个声明在如何访问其内存地址方面的区别以及为什么会出现这种情况?

Che*_*Alf 5

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

数组是数组,指针是指针.

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

int* array_with_automatic_storage = &array_on_stack[0];
Run Code Online (Sandbox Code Playgroud)

  • 这里有一个[C++数组常见问题解答](http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c)问题,主要由Fred Overflow和我编写.你可能比读它更糟糕.在SO上也有一些[C++数组文档](http://stackoverflow.com/documentation/c%2b%2b/3017/arrays#t=201610191331403254374),创建并主要由我编写.我在前面提到作者的共同披露. (2认同)