簡體   English   中英

使用new將內存分配給指針多維數組

[英]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 ++是一種強類型語言。 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]

數組已衰減為指針。 失去了類型和第一維度 最好避免使用數組指針並堅持使用模板和引用 或者更好的是,更喜歡std::vectorstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM