4

只是想了解我需要的健身功能的数组结构。它是一个数组数组:

double fitness[][2][9][11]

根据我的理解,[2][9][11] 数组将是 2 x 9 x 11 3 暗淡数组。没关系,但是 [] 让我失望了。这对数组结构有何贡献?有人可以给我一个示例输入(或者也许像我发布的数组那样尺寸小得多,我们会很大)。

非常感谢。

编辑:这是在一个函数内

4

2 回答 2

3

本质上,不必知道数组中有多少行。首先声明维度的原因是为了使计算机能够访问它使用以下二维数组中索引所指的内存位置(不确定您是否可以查找 4-D 数组)

地址 = Base + ((depthindex*col_size+colindex) * row_size + rowindex) * Element_Size

所以这是一个小例子说我们有以下

int myArray[2][2];
/* put some values in the array */
myFunc(myArray);

然后我们去像这样的函数中访问它

void myFunc(int array[][2])
{
     printf("%d\n", &array[1][1]);
}

本质上,对应于 myArray[1][1] 的 array[1][1] 的地址是使用上面的公式计算的,我们将读取 4 字节的地址解释为整数并将其打印到屏幕上。该函数不关心数组中有多少行的原因是C不做任何边界检查它只需要知道如何计算你使用公式给它的任何索引的内存地址,如果你看一下公式不需要行数(行大小基于列数),因此 C 非常乐意让您在方法声明中省略行数,因为它可以在没有该信息的情况下计算内存地址

于 2012-09-03T15:35:23.760 回答
3

如果减少维度的数量,它会变得更清晰一些。让我们大胆一点,删除除一个维度之外的所有维度,然后声明

 extern double foo[];

这样做是声明一个不完整的类型,一个未知数量的双精度数组。如果您给出明确数量的元素,则该类型将是完整的。不同之处在于您不能将 应用于sizeof不完整的类型:编译器无法知道它们的大小,因为它们是不完整的。

现在,如果我们声明一个数组数组,我们不能让两个维度都是未知的(如 in double foo[][])。这是为什么?以前,编译器可以计算 的位置,foo[42]因为它知道 double 的大小(因为 double 是完整的类型)。要计算foo[1][42]它必须知道元素类型的大小。换句话说,元素类型必须是完整的。在 C 中,最右边的维度变化最快,所以这里的元素类型由除了最左边的维度之外的所有维度给出:double [42]在你原来的问题中它是double [2][9][11].

最后,如果您不需要完整数组的大小,可以将最左边的维度留空。

于 2012-09-03T14:47:55.270 回答