经典数组与 std::array

Agn*_*nes 4 c++ arrays

我试试这个简单的程序:

int* getElement(int arrayy[], int index) {
     return &arrayy[index];
}

int main() {

    int arrayy[4]{};

    *getElement(arrayy, 2)=50;

    std::cout << arrayy[2] << '\n';// here it prints 50 !

    return 0;
 }
Run Code Online (Sandbox Code Playgroud)

getElement() 将通过指针返回返回数组元素的地址,在 main 中取消引用它,然后更改值。

我想std::array 代替经典数组做同样的事情。

int* getElement(std::array<int, 4> arrayy, int index) {
    return &arrayy[index];
}

int main() {


    std::array<int, 4> arrayy{};

    *getElement(arrayy, 2)=50;

    std::cout << arrayy[2] << '\n';//here it prints 0 !

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在第一个它打印 50 和在第二个 0 !

std::array按来电值传递?

cig*_*ien 5

在传递指针的情况下通过值,所述尖在值是在功能和调用点是相同的。所以第一个程序做你所期望的。


在第二个程序中,它是不同的,因为它std::array具有值语义,因此按值传递它意味着您也在传递所有底层内存的副本

请注意,在第二个程序中的代码中,0不能保证的结果。您正在返回一个指向复制内部值的指针,该值std::array将在函数返回时消失。这会调用未定义的行为。

如果你想得到和第一个程序一样的效果,你需要std::array 通过引用来代替:

int* getElement(std::array<int, 4> &arrayy, int index) {
                                // ^  reference
    return &arrayy[index];
}
Run Code Online (Sandbox Code Playgroud)