C++ 指针、数组和新运算符

C++ 指针、数组和新运算符,c++,arrays,pointers,new-operator,dynamic-memory-allocation,C++,Arrays,Pointers,New Operator,Dynamic Memory Allocation,我知道int(*ptr)[3]创建了一个指向3元素整数数组的指针。 我知道new int[1][3]动态分配一些大小为1行x 3列x 4字节(32位机器)=12字节的内存。 我也理解在这种情况下ptr[0]=&ptr[0] 这里分配的总内存为3*12字节。为什么? 为什么LHS上的3依赖于RHS上的3?如果我们在RHS上使用3,我们必须在LHS上使用3。我不能用2或4 也许这是一个微不足道的逻辑,但我似乎找不到关于这方面的好文献。鉴于您迄今提供的信息,我只能回答您问题的第二部分: int (*p

我知道int(*ptr)[3]创建了一个指向3元素整数数组的指针。 我知道new int[1][3]动态分配一些大小为1行x 3列x 4字节(32位机器)=12字节的内存。 我也理解在这种情况下ptr[0]=&ptr[0]

  • 这里分配的总内存为3*12字节。为什么?
  • 为什么LHS上的3依赖于RHS上的3?如果我们在RHS上使用3,我们必须在LHS上使用3。我不能用2或4
    也许这是一个微不足道的逻辑,但我似乎找不到关于这方面的好文献。

    鉴于您迄今提供的信息,我只能回答您问题的第二部分:

    int (*ptr)[3]=new int [1][3];
    

    这意味着您的变量
    ptr
    应该只指向一个长度为三的数组,当您编写
    newint[1][3]
    时,实际上您只创建了一个长度为三的数组,其中只有一行(二维数组)。类似地,新的int[2][3]将提供一个包含两行的三个数组。(2-D数组)这就是为什么这两个三个数组相互依赖。

    首先,分配的总内存不是
    3*12
    字节。它是
    3*1*sizeof(int)+k
    字节,其中
    k
    未指定(但在 大多数实现在分配
    int

    其次,这两个
    3
    必须相等,因为它们是 类型。在左边,类型是“指向3 int的指针”。上 对,您正在分配一个“1数组3整数数组”; 由于数组new的语义 表达式是指向3 int数组的
    (以及任何信息
    关于它是
    int[1][3]
    还是
    int[2][3]
    或任何东西 已丢失)。C++使用静态类型检查(最多) 部分),因此编译器必须知道类型的所有部分
    编译时

    一,。你从哪里得到这个号码的?2.意思不清楚。你在说什么样的依赖关系?你怎么知道它是3*12字节?@n.m.1。我检查了与ptr[0]、ptr[1]和ptr[2]中的每一个相关联的内存地址,它们都相隔12个字节。12字节*3个这样的块。2.依赖性:如果我们在RHS上使用3,我们必须在LHS上使用3。我不能用2或4。我无法想象分配给这里的是什么。(问题编辑)1。没有
    ptr[1]
    。您只分配了大小为1的数组,因此只能访问
    ptr[0]
    。当然有
    ptr[0][0]
    ptr[0][1]
    ptr[0][2]
    。我试图在GCC上检查这一点。当我打印ptr[0]、ptr[1]和ptr[2]的值时,我会得到有效的结果。它们与&ptr[0]、&ptr[1]和&ptr[2]相同。有什么原因让我弄错了吗?它们都是2D数组。@4aRkKn1gh7,因为标准上这么说:-)。该标准之所以这么说,是因为编译器通常必须记住某个地方的元素数量,以便调用正确数量的析构函数。因此,如果分配的类型有平凡的析构函数,那么它将是
    0
    ,如果它有非平凡的析构函数,那么它的值将大于
    0
    。请您进一步解释一下:“由于array new的语义,表达式的类型是指向3 int的数组(以及任何关于它是int[1][3]还是int[2][3]或任何丢失的信息)。”我同意在-1][3]和[2][3]这两种情况下,占用的内存地址保持不变。还有,3*1*sizeof(int)+k中的“1”是什么?如果它是第一个索引,为什么当索引改变时它不会改变?@DMehta没有什么需要澄清的:标准规定,如果
    new
    分配的类型是“t
    数组”,那么不管
    t
    或元素的数量,表达式的类型都是“指向
    t
    ”的指针,指向第一个元素(元素数丢失)。这里唯一特别的是
    T
    本身就是一个数组(int的数组[3])。至于
    3*1*sizeof(int)
    中的
    1
    ,它是表达式
    newint[1][3]
    中的
    1
    。如果您编写
    newint[2][3]
    ,那么它当然会变成
    2
    Why is the 3 on the LHS dependent on the 3 on the RHS?
    
    int (*ptr)[3] // creates a pointer to an array of 3 ints