1

将动态多维数组称为数组数组是否合适?

int **mp = 0;

// Create an array of pointers
mp = new int*[6];

// Where each element of type pointer, points to dynamic array.
for (int x = 0; x < 6; x++)
    mp[x] = new int[7];

看看这个,我会说它们是指向大小为 7 个整数的数组的指针数组。但是动态数组甚至被认为是数组还是只是指针返回的一小块内存?

4

4 回答 4

2

如果我理解正确,您的问题是关于语义的。就标准而言,new []确实创建了一个数组,但返回了一个指向第一个元素的指针。从标准的 5.3.4/5 开始:

当分配的对象是一个数组时...... new 表达式产生一个指向数组初始元素(如果有的话)的指针。

因此,在您的情况下,我们俗称的“数组数组”实际上是指针数组,它与 eg 不同,egint x[6][6]是真正的数组数组。

于 2011-05-30T14:40:34.487 回答
2

是的,它们是指针数组。数组的数组是不同的:

// array of 6 pointers into one-dimensional arrays 7 elements each
int** mp = new int*[6];
for (int x = 0; x < 6; x++)
    mp[x] = new int[7];

// array of 6 arrays of 7 elements each (two-dimensional 6x6 array)
// (all dimensions except the 1st must be known at compile time)
int (*mp)[7] = new int[6][7];
// or, more commonly, when all dimensions are known at compile time,
int mp[6][7];

指针数组通常在 C 中使用,因为在该语言中没有其他方法可以在运行时创建多索引数据结构。

于 2011-05-30T15:49:26.733 回答
0

C++(和 C)对不规则数组和连续多维数组的处理完全不同。访问一个元素看起来是相同的,但在引擎盖下却完全不同。

void do_something (
    double matrix[3][3],
    double ** ragged_array)
{
    double x = matrix[1][2];
    double y = ragged_array[1][2];
    ...
}

第一次访问只需要通过一个指针一次,而第二次需要通过两个指针。

于 2011-05-30T15:14:41.283 回答
0

我将数组视为指针,因为实际上保存数组的变量只是指向数组第一个元素的指针。此外,您可以在任何指针中使用operator[],即使它没有指向数组。带着这样的思路:

mp是指向“整数指针块”的指针,而mp[x]是指向“整数块”的指针。

现在,这些“内存块”就是我认为的数组,所以你有:

mp是指向整数指针数组的指针,而mp[x]是指向整数数组的指针。

在您的示例中,您总共有 7 个数组(内存块),每个语句一个。使用完结构后,不要忘记删除 []中的每一个。

于 2011-05-30T15:32:30.073 回答