我试图弄清楚多维数组,特别是如何通过将它们传递给函数来填充它们。这一切都非常不直观,但最不直观,对我来说根本没有任何意义的是:
为什么在传递二维数组作为参数时必须指定列数,而不是行数?我可能已经查看了五个或更多给出语法的论坛主题,但没有一个解释其背后的原因。我同意编译器需要知道数组的大小才能对其进行操作,但是二维数组基本上不是数组数组吗?
但是二维数组基本上不是数组数组吗?
这是。
但是编译器需要知道大小真的只是为了能够在索引到数组时正确执行指针运算(当然,除了分配,但我们在这里讨论的是函数的上下文),因为多维数组是在记忆中不断。int arr[2][3]
声明连续有 3int
个,两个 3-int
行相互跟随。
现在,当您将数组传递给函数时,数组会发生什么情况,它们会衰减为指针。但是第一个(最里面的)维度衰减为一个是合乎逻辑的,因为我们可以(理论上)使用指向其第一个元素的单个指针来索引一个任意长的数组。
但是,如果有多个维度,则编译器需要这些维度,以便它可以在更多维度上执行指针算术。
这是您应该另外阅读的内容。
当您将数组参数传递给函数时,该参数将转换为指向数组第一个元素的指针。
C++ 中的二维数组实际上是数组的数组。因此,您传递的参数是指向包含第一列的数组的指针。
要访问第二列,指针必须增加超过第一列。为此,编译器必须知道列的大小,就像它必须知道任何其他数组元素的大小一样。
简单的答案是您需要根据指针来考虑数组声明。
当您将数组作为参数传递给函数时,它将衰减为指向数组第一个元素的指针。
int intArray[3]
// Decays into
int * intArray;
这在编译器的脑海中是等价的。当您通过索引引用数组时,编译器实际上将使用指针算法来确定要转到哪个内存槽。
现在使用您的二维数组,它实际上也衰减为指向第一个元素的指针。如果数组声明在堆栈上,则 2D 存储实际上是 Row Major 格式。这是许多 C++ 新手忽略的问题。编译器需要知道列值才能执行指针运算以找到您要查找的元素。C++ 数组不是对象,这就是我的朋友为什么在 C++ 中没有对数组进行长度检查的原因。