“new int * **[10]”是什么意思?

3

我在某处看到了以下代码,但有些困惑。

int****            m_ppppCoder;
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];

在这种情况下,实际数据是如何排列(分配)在内存中的?它们是按顺序排列的吗?

24
这句话的意思是你应该远离这段代码。 - Ron
8
好的,我会尽力进行翻译。以下是您要求的内容:http://wiki.c2.com/?ThreeStarProgrammer - EdChum
1
就此而言,该代码创建了一个包含10个指针的数组。每个指针的类型为int***。这可能是某个多维数组的开始,但目前它只是一个指针数组。 - Pete Becker
2
如果您有5分钟的空闲时间,我刚刚为您录制了一个视频答案! - fredoverflow
1
@TheUnknown 我曾经使用过这样的代码进行三维等间距结构的插值。一旦你设置了指向适当位置的指针,就可以编写像(v[-1][0][1]+v[1][0][-1])/2这样的表达式。然而,我已经很长时间没有这样做了,当时是在没有缓存的嵌入式应用程序上。如果在现在编写这样的代码,那将是疯狂和低效的。 - doug
显示剩余5条评论
1个回答

9

那是一个动态分配的三维整数数组吗?

不是。

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];

In this case, the actual data how are arranged (allocated) inside the memory ie sequentially ?

就像这样:

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个数组。由于它们是独立的分配,因此这4个数组互相独立,都在自由存储器中。
一个数组中的元素本身在内存中是连续的。因此,与同一数组的其他元素相关的每个指针(或者在最后一个元素情况下是整数)在内存中也是连续的。
请注意,对于所有的x在[1,10)范围内,m_ppppCoder[x]、m_ppppCoder [0][x]和m_ppppCoder[0][0][x] 都是未初始化的指针。

@Borgleader 这句话可能也有错误。我会感激任何人的审查 :) - eerorika
谢谢你的回答! - Maverick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接