代码之家  ›  专栏  ›  技术社区  ›  Cristian

在C++中通过函数传递未经数组的数组[复制]

  •  0
  • Cristian  · 技术社区  · 6 年前

    float addLayer(float layers[]){
        float addColor = 0;
        if (std::find(std::begin(layers), std::end(layers), addColor)){
            // run code
            addColor = ...;
        }
        return addColor
    }
    
    float layers[] = {0};
    newColor = addLayer(layers[]); //line 2
    

    我收到的错误:

    Expected identifier or '(' on line 2
    

    2 回复  |  直到 6 年前
        1
  •  1
  •   Chris Dodd    6 年前

    问题是不能把C数组作为函数传递给函数,C不允许它,所以C++也不允许。如果你声明一个函数以一个C数组作为参数,编译器会悄悄地把它变成一个指针,所以你实际上是在传递一个指针。因此,在该指针参数上调用std::begin和std::end将不起作用。

    为了使这项工作在C++中,你需要使用 std::array std::vector 相反。

        2
  •  4
  •   Aconcagua    4 年前
    float addLayer(float layers[]);
    

    相当于

    float addLayer(float* layers);
    

    要保留长度信息,可以在单独的参数中传递,也可以传递对数组的引用:

    template <size_t N>
    float addLayer(float(&layers)[N]); // pass reference to array of length N
    

    此外,还有一个语法错误:

    newColor = addLayer(layers[]);
    //                        ^^
    

    已经有了一个数组(但是如果传递给函数的指针版本,则会衰减为指针),而在上面一行中实际要做的是对数组应用index运算符,但是不带参数(注意,有了参数,将得到一个浮点值,不再是指针)。

    最后:两者 std::array std::vector (可变大小)是原始数组的更好的替代方法,希望尽可能使用其中之一。