前段时间我问了一个question我告诉我(在提交中)使用术语“多维数组”来构造这样的结构:
int **a;
初始化如下:
a = malloc(n * sizeof(*a));
for (i = 0; i < n; ++ i)
a[i] = malloc(m * sizeof(*a[i]));
具有误导性,并且这是“仅仅是对多维数组的仿真”。我不是英语母语人士,我很难搞清楚什么是正确的术语。不幸的是,抱怨这个术语的人自己没有帮助。
果然,“多维数组仿真”一词太长,无法在文本/会话中实际使用。
总结一下:
附带问题:
注意:如果您的答案与参考文献相关,我会很高兴
修改:我了解此构造与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;
答案 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
)也可用于构造锯齿状数组,因此术语不会具体指代您拥有的内容。