“ new int * ** [10]”是做什么的?

时间:2018-08-03 11:49:57

标签: c++ arrays memory memory-management new-operator

我在以下地方看到了以下代码,我有点困惑。

int****            m_ppppCoder;
m_ppppCoder = new int ***[10];

是动态分配的3维int数组吗?有人可以确切解释它是如何工作的吗?

在阅读注释后添加:上面的声明本身并不是一个完整的3d int数组,而是具有数组创建第一步的声明结构。据此,通过下面的代码,您可以动态创建3d数组。那是正确的吗?

m_ppppCoder[0] = new int **[10];
m_ppppCoder[0][0] = new int *[10];
m_ppppCoder[0][0][0] = new int[10];

在这种情况下,实际数据如何在内存中(即顺序地)排列(分配)?

1 个答案:

答案 0 :(得分:9)

  

是动态分配的3维int数组吗?

否。

int****            m_ppppCoder

m_ppppCoder是一个指向整数的指针的指针。

m_ppppCoder = new int * **[10];

m_ppppCoder指向动态分配的10指针数组的第一个元素,该指针指向一个整数指针。

  

有人能确切解释它是如何工作的吗?

好吧,它是指向数组元素的指针,因此它本身并不会执行任何工作。用法示例:

int i = 42;                 // an integer i
int *ii = &i;               // ii points to i
int **iii = ⅈ            // iii points to ii
m_ppppCoder[0] = &iii;      // the first element points to iii
int j = ****m_ppppCoder[0]; // the value of j is now 42
delete[] m_ppppCoder;       // never forget to delete dynamic memory

int****可能没有很好的实际用途。


m_ppppCoder = new int ***[10];
m_ppppCoder[0] = new int **[10];
m_ppppCoder[0][0] = new int *[10];
m_ppppCoder[0][0][0] = new int[10];
     

在这种情况下,实际数据如何在内存中(即顺序地)排列(分配)?

赞:

pointer to int***     p
                      |
an array of 10 int*** |->[0][1][2][3]...
                          |
an array of 10 int**      |->[0][1][2][3]...
                              |
an array of 10 int*           |-> [0][1][2][3]...
                                   |
an array of 10 int                 |-> [0][1][2][3]...

这很简单。您已经分配了4个阵列。由于它们是单独的分配,因此这四个数组中的每个数组都在免费存储中的某个位置彼此分开。

数组元素本身在内存中是连续的。因此,每个指针(或最后一个指针的整数)在内存中相对于同一数组的其他元素都是连续的。

请注意,m_ppppCoder[x]m_ppppCoder[0][x]m_ppppCoder[0][0][x]是[1,10)中所有x的未初始化指针。