当我在函数内部声明矩阵时,示例:int recur(int mat [] [],int ....)为什么编译器返回错误,但是使用数组,它可以正常工作吗?
编译器需要知道除第一个尺寸外的所有尺寸,以便计算偏移量。认为二维数组具有行和列。int mat[4][5]
有4行5列。
在这种情况下,这就是数组在概念上的样子。每个数字都是我们在数组中找到对应元素的索引:
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
但是,它在内存中的实际布局方式是由20个元素组成的线性序列:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
访问mat[2][3]
告诉编译器在此处定位元素13(第二行,第三列,从零开始)。它通过乘以来实现2*5 + 3 == 10 + 3 == 13
。注意,为了执行此计算,必须知道列数。
如果您有假设变量int mat[][]
并且尝试索引,mat[2][3]
那么编译器如何执行此计算?它不知道数组有多少列。它根本无法计算元素的线性偏移,因为它没有足够的信息来执行此操作。
请注意,在上面的示例中未使用第一维度(4);编译器不需要知道此维,因为系数隐式为1。
这就是为什么必须知道除第一维以外的所有维数的原因。第一维是唯一具有隐含系数的维。
一种解决方案是使函数成为模板:
template <int N>
int recur(int mat[][N]) {
// ...
}
当使用二维数组调用时,编译器将使用此模板实例化具有的适当值的函数版本,N
函数主体将在对数组建立索引时将其用作乘法系数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句