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

C++ 是否为堆栈本地数组创建指针变量?,c++,c,arrays,pointers,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; } #包括 int main() { 整数指数; 标准:cin>>索引; int*dynArra

考虑以下代码:

#include <iostream>

int main()
{
    int index;
    std::cin >> index;

    int* dynArray = new int[5];
    dynArray[index] = 1;

    int stackArray[5];
    stackArray[index] = 1;
}
#包括
int main()
{
整数指数;
标准:cin>>索引;
int*dynArray=新int[5];
dynArray[索引]=1;
int-stackArray[5];
stackArray[index]=1;
}
我确信
dynArray
是一个简单的
int*
指针,它需要堆栈上额外的
sizeof(int*)
字节

问题1:是否在堆栈上为
stackArray
创建了额外的指针变量?如果是这样的话,这种情况经常发生吗?如果不是,那么
stackArray[index]=1在不知道数组基的情况下工作,即编译器如何决定向
索引添加什么值来计算地址

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

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

  • GCC/Linux,x86
  • Visual Stuidio 2013,x86
    • dynarray
      是一个变量。它的类型是
      int*
      ,并且具有自动存储持续时间(“在堆栈上”)。它的值是指向其他地方某个元素的指针。在某种程度上,它碰巧指向某个数组中其他位置的元素这一事实是偶然的

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

    请注意,在您的示例中,
    dynarray[index]
    是元素的数组本身不是变量,元素本身也不是。您只能访问元素对象,因为您有指向它们的指针。(实际上,数组对象本身无法表达,因为它的类型在编译时是可知的。动态数组是C++中的一部分,在这里你拥有真正的动态类型。)
  • stackArray
    是一个数组,而不是指针。它的类型是
    int[5]
    ,即
    5
    整数的数组。编译器知道数组的元素类型,即
    int
    <代码>堆栈数组[索引]
  • 的计算结果为
    *(堆栈数组+索引)
    。这里,数组
    stackArray
    的计算结果是指向其第一个元素的指针

  • C
    C++
    在具有自动存储分配的阵列方面是相同的


  • @首先,
    int*dynArray=new int[5]
    int stackArray[5]
    @40two不是同一类型,这就是为什么我要问这个问题。使用gcc,您可以使用-s标志编译代码来生成汇编代码,并自己验证这两个数组是如何分配的。不过,我希望dynArray会在堆里。不知道是否有类似的选择VS2013@juanchopanza谢谢删除了误导性部分。
    这里,数组stackArray的计算结果是指向其第一个元素的指针。
    :确定,那么计算结果存储在哪里?它是在运行时还是编译时计算的?@BabkenVardanyan它是在编译时计算的。它不存储,但用于确定值
    1
    存储在语句
    stackArray[index]=1中的地址。有关详细信息,请阅读此内容。我也将此内容留在这里。从概念上讲,讨论阵列衰减也可能对OP有所帮助。
    stackArray[index],该表达式表示相应的阵列元素。
    :好的,但这是如何发生的?它会神奇地计算
    ?+索引
    <代码>???
    应该是某种东西。@BabkenVardanyan:这有关系吗?当您有
    对x时x.second=10
    ,你关心“它是如何工作的”吗?该语言具有数组类型和数组对象的元素子对象寻址的概念。这还不够吗?(是的,有关于指针算术和数组到指针衰减的规则,但我认为你不需要了解这些规则来理解数组。)你可以类似地问
    inta;a=10有效(为什么不说
    *&a=10
    ?)-但是能够访问变量只是语言的一部分。。。