数组的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的指针)不匹配。打字错误