指针,数组和新的运算符

时间:2014-07-09 07:47:36

标签: c++ arrays pointers new-operator dynamic-memory-allocation

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

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

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

2 个答案:

答案 0 :(得分:2)

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

其次,两个3必须相等,因为它们是其中的一部分 类型。在左边,类型是"指向3 int"的指针。在 是的,你正在分配一个3个int"的1个数组的"数组; 因为数组new的语义,类型 表达式为point to array of 3 int(以及任何信息 关于它是int[1][3]还是int[2][3]还是其他什么 已经失去了)。 C ++使用静态类型检查(最多 部分),因此编译器必须知道该类型的所有部分 编译时间。

答案 1 :(得分:0)

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

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

这意味着你的变量ptr应该只指向一个长度为三的数组数组,当你编写new int [1][3]时,你实际上是在创建一个长度为三的数组(一行)(2-D)数组)只。类似地,new int [2][3]会给你一个有两行的三个数组。(二维数组)这就是为什么两个三个都相互依赖的原因。