是否为堆栈本地数组创建了指针变量?

时间:2014-05-24 15:11:03

标签: 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*)个字节。

问题1 :是否还在stackArray的堆栈上创建了一个额外的指针变量?如果是这样,那总是会发生吗?如果没有,那么stackArray[index] = 1;如何在不知道数组基础的情况下工作,即编译器如何决定添加到index以计算地址的值?

问题2 :C / C ++之间有什么区别吗?

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

  1. GCC / Linux,x86
  2. Visual Stuidio 2013,x86

2 个答案:

答案 0 :(得分:6)

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

  • stackArray是一个变量。它的类型是int[5],它有自动存储持续时间。它的值是一个由五个整数组成的数组。在stackArray[index]这样的表达式中使用变量名时,该表达式表示相应的数组元素(它是数组对象的子对象)。

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

答案 1 :(得分:5)

  1. stackArray是一个数组,而不是指针。它的类型是int[5],即5整数数组。编译器知道数组的元素类型intstackArray[index]评估为*(stackArray + index)。这里,数组stackArray求值为指向其第一个元素的指针。

  2. CC++在具有自动存储空间分配的数组方面相同。