使用新的

时间:2017-01-18 19:03:39

标签: c++ arrays multidimensional-array new-operator

我无法理解c ++中的一些基本内容并且一直在想。请帮我。 我知道p指向的内存是一个3x4大小的2D int矩阵。

int(*p)[3][4];

1)为什么我不能分配如下的内存?

p = new int[3][4];

2)应该像以下一样工作。但为什么呢?

p = new int [1][3][4];    //or new int [5][3][4]; etc

3)以下代码行是什么意思?它在语义上是正确的,但它在做什么?以下行中empty []的意义是什么?

p = new int [ ][3][4];

2 个答案:

答案 0 :(得分:2)

c ++是一种强类型语言。 intint*不同。同样,int[3]int*的类型不同。但是用棍子轻轻戳戳int[3]它会分崩离析并衰减到int*。 c ++这样做是因为c做到了。

  

为什么我不能分配内存如下?

p = new int[3][4];

因为new正在返回指向int[4]的指针:

auto p1 = new int[3][4]; // int(*p1)[4]

数组对指针有decayed。它有lost the type and first dimension。最好避免使用数组指针并坚持using templates and references。或者更好的是,更喜欢std::vectorstd::array

您可以拥有指向同一地址的多个指针,but with different typescan be confusing

  

2)应该像以下一样工作。但为什么呢?

p = new int [1][3][4];

在此示例中,int[3][4]的数组也已衰减为指针:

auto p2 = new int [1][3][4]; // int(*p2)[3][4]

因此,new返回的值可以分配给p,因为它具有相同的类型。但请注意,指针类型不包含有关数组大小的信息,它只有一种类型,指向恰好是较低维度的数组(不会被指针衰减)的元素。

  

3)以下代码行是什么意思?它在语义上是正确的   但它在做什么?以下是空[]的重要意义   线?

p = new int [ ][3][4];

这可能并不总是编译,如果确实如此,则compiler extension将确定空方括号的值。

答案 1 :(得分:1)

因为在C中,“int * p”有两种解释。 您可以将P视为指向单个整数的指针,但也可以将其视为指向整数数组的指针。

一个常见的例子,字符串。 char * a =“你好”;

“a”是指向单个字符'h'的指针,但更常见的是它被视为指向字符数组的指针,也就是字符串。

所以,你可以这样做:     char * a = new char [6];     strcpy(a,“hello”);

我相信你的第三个例子不是有效的C ++。

虽然这个:    p = new int [9] [3] [4]; 分配9个3x4二维数组的数组。

试试这个测试:

int test()
{
    int(* p)[3][4] = new int[1][3][4];

    printf("sizeof(p)=%d, sizeof(*p)=%d\n", sizeof(p), sizeof(*p) / sizeof(int));

    size_t q1 = (size_t)&p[0][0][0];
    size_t q2 = (size_t)&p[1][0][0];
    printf("p, diff: %d\n", (q2 - q1) / sizeof(int));

    size_t r1 = (size_t)&p[0][0][0];
    size_t r2 = (size_t)&p[0][1][0];
    printf("p, diff: %d\n", (r2 - r1) / sizeof(int));

    size_t s1 = (size_t)&p[0][0][0];
    size_t s2 = (size_t)&p[0][0][1];
    printf("p, diff: %d\n", (s2 - s1) / sizeof(int));
    return 0;
}