arr 的类型是 double[X][Y] - 即 Y 双精度的 X 数组的数组 - 其中 X 和 Y 取决于您的初始化程序。这与指针类型不相同。但是,根据 C 转换规则,数组可以衰减为指向其元素的指针。在您的情况下,这种衰减产生的类型将是 double(*)[Y] - 指向 Y 双精度数组的指针。请注意,这是一个指向数组的指针,而不是一个指针数组,因此它不会进一步衰减。此时,您会遇到类型不匹配,因为您的函数需要 double**。
处理这个问题的正确方法是将数组视为一维的,并传递宽度。所以:
void func(double* arr, int w) {
// arr[2][3]
arr[2*w + 3] = ...;
}
double x[6][8] = { ... };
func(&x[0][0], 8);
特别是在 C++ 中,如果您总是静态分配已知(但不同)类型的数组,您可以使用这样的模板和引用:
template <int W, int H>
inline void func(const double (&arr)[W][H]) {
arr[2][3] = ...;
}
double x[6][8] = { ... };
func(x); // W and H are deduced automatically
但是,当您只有一个指针时(例如,当数组是 new-allocated,并且它的大小是在运行时计算时),这将不起作用。对于最一般的情况,您应该改用 C++ 容器。仅在标准库中,通常使用向量的向量:
#include <vector>
void func(std::vector<std::vector<double> > arr) {
arr[2][3] = ...;
}
std::vector<std::vector<double> > x(6, std::vector<double>(8));
x[0][0] = ...;
...
func(x);
如果你可以使用 Boost,它里面有一个非常好的 MultiArray 库:
void func(boost::multi_array<double, 2> arr) { // 2 means "2-dimensional"
arr[2][3] = ...;
}
boost::multi_array<double, 2> x(boost::extents[6][8]);
x[0][0] = ...;
...
func(x);
[EDIT] 你说你不能改变你的函数的定义。如果是这样,那么它确实是将其参数视为指针数组的函数,因此您应该相应地分配数据结构。例如:
double x1[8] = { 1, 2, ... };
double x2[8] = { 3, 4, ... };
...
double* x[6] = { x1, x2, ... };
func(x);