3

前段时间我问了一个问题,我被告知(在提交中)使用术语“多维数组”来表示这样的构造:

int **a;

像这样初始化:

a = malloc(n * sizeof(*a));
for (i = 0; i < n; ++ i)
    a[i] = malloc(m * sizeof(*a[i]));

具有误导性,并且这“只是一个多维数组的模拟”。不是以英语为母语的人,我很难弄清楚什么是正确的术语。不幸的是,抱怨术语的人自己也无济于事。

果然,“多维数组的仿真”这个词太长了,无法在文本/对话中实际使用。

总结一下:

  • 上述构造的正确术语是什么(特别是在 C 中,如果有区别的话)?

附带问题:

  • 这个术语语言不可知论吗?如果不是,例如在 C++ 中如何调用它?

注意:如果您的答案与参考相关,我会很高兴。
编辑:我理解这个构造和int a[n][m];. 那不是问题。

更新

分配的内存不一定是规则的。这种结构更精确:

a = malloc(n * sizeof(*a));
for (i = 0; i < n; ++ i)
  if (needed[i])
    a[i] = malloc(m[i] * sizeof(*a[i]));
  else
    a[i] = NULL;
4

4 回答 4

7

我一直听说这些被称为“锯齿状数组”——即使每个子数组的长度相同,它们可以具有不同的长度,因此称为“锯齿状”。(在真正的多维数组中,每个维度都有固定的大小,在这种情况下,只有第一个维度是真正固定的。)

于 2012-07-20T04:18:26.960 回答
1

它是“(指向)数组的数组”,该术语在多种语言中都可以理解,并且适用于元素数组的长度是否相等(方形 AoA)或不相等(锯齿状 AoA)。

于 2012-07-20T04:35:28.850 回答
1

“嵌套数组”或“数组数组 [of ...]”。

虽然我不认为它支持不同的维度,但 Boost 在这个模糊的空间中提供了一个产品 - http://www.boost.org/libs/multi_array/doc/user.html - 设计决策和界面甚至可能值得考虑如果你正在实施一些新的东西。

于 2012-07-20T05:42:32.653 回答
0

我会将构造称为“模拟多维数组”,就像它们在c-faq中所做的那样。如果您认为该术语太长,您可以说“模拟二维数组”等。但是,int **a;永远不要将其称为多维数组,因为它的类型是指向int. 我认为区别在于指针可用于构造数组,但它们将始终保留为指针。另外,应该知道指针数组int *a[10];

于 2012-07-20T04:55:20.910 回答