2008-12-23 75 views
8

如果我创建一个文件:无法转换(*)[]以**

TEST.CPP:

void f(double **a) { 

} 

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

然后运行: G ++ TEST.CPP -o测试

我得到

test.cpp: In function `int main()': 
test.cpp:8: error: cannot convert `double (*)[2]' to `double**' for argument `1' 
to `void f(double**)' 

为什么我不能这样做?

是不是双var [4] [2]是做双** var然后分配内存相同?

回答

17

C++ strings: [] 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]距离[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.

+0

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

0

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

这将工作:

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

而且,它会努力改变f的定义:

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

现在˚F采用指向你有类型的数组。那可行。

+1

没有不行。你的f函数需要double **,而不是指向数组的指针。而且你的演员阵容也是错误的。将double [4] [2]转换为double *并期望这样工作是不正确的。出于上述原因。请不要这样做。 – 2008-12-24 02:21:01

相关问题