[英]Allocating memory to pointer multidimensional array with new
我無法理解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];
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]
數組已衰減為指針。 它失去了類型和第一維度 。 最好避免使用數組指針並堅持使用模板和引用 。 或者更好的是,更喜歡std::vector
或std::array
。
您可以有多個指向同一地址的指針, 但使用不同的類型 ,這可能會造成混淆 。
2)應該像下面的工作。 但為什么?
p = new int [1][3][4];
在這個例子中, int[3][4]
的數組也已經衰減為一個指針:
auto p2 = new int [1][3][4]; // int(*p2)[3][4]
所以這里new
返回的值可以分配給p
因為它具有相同的類型。 但請注意,指針類型不包含有關數組大小的信息,它只有一個類型,指向恰好是較低維度的數組(沒有衰減到指針)的元素。
3)以下代碼行是什么意思? 它在語義上是正確的,但它在做什么? 以下行中empty []的意義是什么?
p = new int [ ][3][4];
這可能並不總是編譯,如果確實如此,那么它是一個編譯器擴展 ,它將確定空方括號的值。
因為在C中,“int * p”有兩種解釋。 您可以將P視為指向單個整數的指針,但也可以將其視為指向整數數組的指針。
一個常見的例子,字符串。 char * a =“你好”;
“a”是指向單個字符“h”的指針,但更常見的是它被視為指向字符數組(也稱為字符串)的指針。
所以,你可以這樣做:char * a = new char [6]; strcpy(a,“你好”);
我相信你的第三個例子不是有效的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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.