我无法理解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];
答案 0 :(得分:2)
c ++是一种强类型语言。 int
与int*
不同。同样,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::vector
或std::array
。
您可以拥有指向同一地址的多个指针,but with different types,can 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;
}