考虑以下代码:
#include <iostream>
int main()
{
int index;
std::cin >> index;
int* dynArray = new int[5];
dynArray[index] = 1;
int stackArray[5];
stackArray[index] = 1;
}
我确信 dynArray
是一个简单的 int*
指针,它在堆栈上占用额外的 sizeof(int*)
字节。
问题一:stackArray
是否也在栈上创建了一个额外的指针变量?如果是这样,那是否总是发生?如果不是,那么 stackArray[index] = 1;
如何在不知道数组基数的情况下工作,即编译器如何决定将什么值添加到 index
以计算地址?
问题2:C/C++有区别吗?
我想要这两种环境的答案:
- 海湾合作委员会/Linux,x86
- Visual Stuidio 2013,x86
最佳答案
dynarray
是一个变量。它的类型是int *
,并且它有自动存储持续时间(“在堆栈上”)。它的值是指向其他地方某个元素的指针。它恰好指向其他地方某个数组的元素这一事实在某种程度上是偶然的。stackArray
是一个变量。它的类型是int[5]
,它有自动存储期限。它的值是一个包含五个整数的数组。当您在像stackArray[index]
这样的表达式中使用变量的名称时,该表达式表示相应的数组元素(它是数组对象的子对象)。
请注意,在您的示例中,dynarray[index]
是元素的数组本身不是变量,元素本身也不是。您只能访问元素对象,因为您有指向它们的指针。 (实际上,您根本无法表达数组对象本身,因为它的类型在编译时是可知的。动态数组是 C++ 中真正具有动态类型的部分。)
关于c++ - 是否为堆栈局部数组创建了指针变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23846580/