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

时间:2008-12-23 23:34:21

标签: c++

如果我创建文件:

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 个答案:

答案 0 :(得分:18)

C++ strings: [] vs. *

查看 Excursion:Multi Dimensional Arrays ,它描述了如何将多维数组作为参数传递给函数。基本上,您希望将代码更改为:

// 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);
}

被调用的函数必须知道除了最后一个维度之外的所有维度。否则索引数组,编译器将无法计算到数组中值的正确距离([1]距离[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.

答案 1 :(得分:-1)

问题是double **是指向指针的指针。你的'f'函数想要传递指向double的指针的地址。如果你调用f(var),那么,你认为指针究竟在哪里?它不存在。

这将有效:

double *tmp = (double *) var;
f (&tmp);

此外,它可以改变f:

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

现在f获取指向您拥有的数组类型的指针。这将有效。