“动态分配内存模拟多维数组”的正确术语?

时间:2012-07-20 04:16:35

标签: c++ c arrays terminology

前段时间我问了一个question我告诉我(在提交中)使用术语“多维数组”来构造这样的结构:

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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

这是一个“数组(指向)数组”,这个术语可以在各种语言中理解,并适用于元素数组的长度是否相等(方形AoAs)或不是(锯齿状的AoAs)。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我会像c-faq中那样将构造称为“模拟多维数组”。如果您认为该术语太长,您可以说“模拟二维数组”等。但是,永远不应该将int **a;称为多维数组,因为它的类型是指向{的指针{1}}。我认为区别在于指针可用于构造数组,但它们将始终作为指针保留。此外,应该知道指针数组(int)也可用于构造锯齿状数组,因此术语不会具体指代您拥有的内容。