Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组的C数组_C_Arrays - Fatal编程技术网

数组的C数组

数组的C数组,c,arrays,C,Arrays,我只是想了解一个数组结构,我需要一个适应度函数。它是一个数组: double fitness[][2][9][11] 就我的理解而言,[2][9][11]阵列是一个2×9×11的3维阵列。那很好,但是[]把我甩了。这对阵列结构有何影响?有没有人能给我一个例子来说明这一点(或者可能是因为我发布的数组的维数要小得多,我们会非常大) 非常感谢 编辑:这是在一个函数中如果减少维度的数量,它会变得更清晰。让我们大胆一点,删除除一个维度以外的所有维度,并声明 extern double foo[];

我只是想了解一个数组结构,我需要一个适应度函数。它是一个数组:

double fitness[][2][9][11]
就我的理解而言,[2][9][11]阵列是一个2×9×11的3维阵列。那很好,但是[]把我甩了。这对阵列结构有何影响?有没有人能给我一个例子来说明这一点(或者可能是因为我发布的数组的维数要小得多,我们会非常大)

非常感谢


编辑:这是在一个函数中

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

 extern double foo[];
它所做的是声明一个不完整类型,一个包含未知数量的双精度数组。如果给出了显式的元素数,则该类型将是完整的。不同之处在于不能将
sizeof
应用于不完整的类型:编译器无法知道它们的大小,因为它们是不完整的

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


一天结束时,如果不需要完整数组的大小,可以将最左边的维度留空。

基本上不需要知道数组中有多少行。首先声明维度的原因是为了让计算机能够访问二维数组中由Indicate引用的内存位置,它使用了以下内容(不确定是否可以查找四维数组)

地址=基+((深度索引*列大小+共索引)*行大小+行索引)*元素大小

下面是一个小例子,我们有以下几点

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

这是函数参数的声明吗?该声明符的含义取决于它的使用位置(即在函数声明符或变量定义的一部分中)。在声明数组变量时,从初始值设定项推断最外层的数组范围。作为函数参数传递时,数组将衰减为指针,因此最外面的数组范围也不相关。printf格式%d(int)与参数(指向int的指针)不匹配。打字错误