gpt4 book ai didi

c++ - 无法将 (*)[] 转换为 **

转载 作者:可可西里 更新时间:2023-11-01 17:20:42 26 4
gpt4 key购买 nike

如果我创建一个文件:

测试.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**)'

为什么我不能这样做?

double var[4][2]不就等于double **var然后分配内存吗?

最佳答案

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] 是 sizeof(double[2]) 字节远离 a[0])。

您似乎希望能够在不知道维度大小的情况下接受数组。您可以为此使用模板:

template<std::size_t N>
void f(double a[][N]) {
// N == 2 for us
}

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

编译器将为函数使用的每个 N 值复制(实例化)该模板,自动推导正确的 N。

关于c++ - 无法将 (*)[] 转换为 **,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/390385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com