我试图找出多维数组,特别是如何通过将它们传递给函数来填充它们。这一切都非常不直观,但对我来说根本没有任何意义的不直观的事情是:
为什么在将2d数组作为参数传递时,必须指定列数,而不是行数?我可能会查看五个或更多提供语法的论坛帖子,但没有人解释其背后的原因。我很好,编译器需要知道要对其进行操作的数组的大小,但是二维数组基本上不是一个数组数组吗?
答案 0 :(得分:10)
但是二维数组基本上不是一个数组数组吗?
是。
但是编译器需要知道大小才真正只是为了能够在索引到数组时正确执行指针算法(当然,除了分配之外,我们在这里的函数上下文中说话),因为多维数组在内存中是连续的。 int arr[2][3]
声明连续有3 int
个,并且两个3 - int
行互相跟随。
现在,将数组传递给函数时,数组会发生什么变化,它们会衰减成指针。但是,第一个(最里面的)维度衰减成一个是合乎逻辑的,因为我们可以使用指向其第一个元素的单个指针来索引(理论上)一个任意长的数组。
但是,如果有多个维度,则编译器需要这些维度,以便它可以在更多维度上执行指针算法。
Here is你还应该阅读的内容。
答案 1 :(得分:4)
将数组参数传递给函数时,参数将转换为指向数组第一个元素的指针。
C ++中的二维数组实际上是一个数组数组。因此,您传递的参数是指向包含第一列的数组的指针。
要访问第二列,指针必须递增超过第一列。为此,编译器必须知道列的大小,就像它必须知道任何其他数组元素的大小一样。
答案 2 :(得分:0)
除了第一个尺寸之外,您实际上需要指定所有尺寸。原因是编译器不会知道要分配多少内存。
有关详细答案,请参阅以下问题:
答案 3 :(得分:0)
简单的答案是你需要根据指针来考虑数组声明。
当您将数组作为参数传递给函数时,它将衰减为指向数组第一个元素的指针。
int intArray[3]
// Decays into
int * intArray;
这在编译器的头脑中是等价的。当您通过索引引用数组时,编译器实际上将使用指针算法来确定要去哪个内存槽。
现在使用2D数组,它实际上也衰减成指向第一个元素的指针。如果声明数组在堆栈上,则2D存储实际上是Row Major格式。这是很多人对C ++不熟悉的事情。编译器需要知道列值才能执行指针运算以找到您要查找的元素。 C ++数组不是对象,我的朋友就是为什么在C ++中没有对数组进行长度检查的原因。