无法将(*)[]转换为**。

8
如果我创建一个文件:
test.cpp:
void f(double **a) {

}

int main() {
    double var[4][2];
    f(var);
}

然后运行: g++ test.cpp -o test
我得到:
test.cpp: In function `int main()':
test.cpp:8: error: cannot convert `double (*)[2]' to `double**' for argument `1'
 to `void f(double**)'

为什么我不能这样做?

使用double var [4] [2] 不是等同于使用double **var 然后分配内存吗?

2个回答

19

C++字符串:[] vs. *

看看“旁注:多维数组”,其中描述了如何将多维数组作为参数传递给函数。 基本上,您需要将代码更改为以下内容:

// same as void f(double (*a)[2]) {
void f(double a[][2]) { 

}

int main() {
    // note. this is not a pointer to a pointer, 
    // but an array of arrays (4 arrays of type double[2])
    double var[4][2];

    // trying to pass it by value will pass a pointer to its
    // first element 
    f(var);
}
被调用的函数需要知道除了最后一维之外的所有维度。否则,编译器将无法计算到达数组中值的正确距离(a[1]与a[0]相差sizeof(double[2])字节)。
你似乎想要在不知道维度大小的情况下接受数组。你可以使用模板来实现这一点:
template<std::size_t N>
void f(double a[][N]) { 
    // N == 2 for us
}

int main() {
    double var[4][2];
    f(var);
}
编译器将针对每个在函数中使用的N值制作(实例化)该模板的副本,并自动推断正确的N。

谢谢,我喜欢你给我的链接,因为我可以从那里获得更深入的见解。还有你给我的模板示例。 double a[][2] 正是我在我的特定程序中所需要的。 - Ezequiel

-1
问题在于double**是指向指针的指针。您的“f”函数希望传递一个指向双精度浮点数的指针的地址。如果您调用f(var),那么您认为指针在哪里?它不存在。
这将会起作用:
double *tmp = (double *) var;
f (&tmp);

此外,更改f的定义也可以起作用:

void f (double a[4][2]) { }

现在f函数接受指向你所拥有的数组类型的指针。这样就可以正常工作了。


1
不,那样行不通。你的f函数需要double*而不是指向数组的指针。而且你将其转换为double是错误的。将double[4][2]强制转换为double*并期望它能正常工作是不正确的,原因如上所述。请不要这样做。 - Johannes Schaub - litb
你说得对,我的声明与我想要做的不符合。 - Larry Gritz
1
你所谓的“工作”,是指“彻底失败”吗?永远不要盲目地转换数值。 - Fred Nurk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接