c++ - 是否为堆栈局部数组创建了指针变量?

标签 c++ c arrays pointers

考虑以下代码:

#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++有区别吗?

我想要这两种环境的答案:

  1. 海湾合作委员会/Linux,x86
  2. Visual Stuidio 2013,x86

最佳答案

  • dynarray 是一个变量。它的类型是int *,并且它有自动存储持续时间(“在堆栈上”)。它的值是指向其他地方某个元素的指针。它恰好指向其他地方某个数组的元素这一事实在某种程度上是偶然的。

  • stackArray 是一个变量。它的类型是int[5],它有自动存储期限。它的值是一个包含五个整数的数组。当您在像 stackArray[index] 这样的表达式中使用变量的名称时,该表达式表示相应的数组元素(它是数组对象的子对象)。

请注意,在您的示例中,dynarray[index] 是元素的数组本身不是变量,元素本身也不是。您只能访问元素对象,因为您有指向它们的指针。 (实际上,您根本无法表达数组对象本身,因为它的类型在编译时是可知的。动态数组是 C++ 中真正具有动态类型的部分。)

关于c++ - 是否为堆栈局部数组创建了指针变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23846580/

相关文章:

c++ - 将模板化的 std::array<std::vector<T>, N> 放入构造函数初始化列表中

c - 是否有必要将 return 置于 void 递归中?

arrays - 将数组附加到 UserDefaults 而不删除原始 UserDefault 信息

c++ - 理解这个复杂的声明

c++ - 来自 cin 的未知行为

c - 无法将字符串保存到 log.txt

python - 对角蛇填充数组

javascript - JS : Boolean Array vs Int8Array

c++ - mt19937 和正态分布

android - 处理 Android 原生 Activity 中的主要命令