首页 > 解决方案 > 经典数组与 std::array

问题描述

我试试这个简单的程序:

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

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

第一个打印 50 ,第二个打印 0 !

std::array在调用中传递值吗?

标签: c++arrays

解决方案


在通过 value传递指针的情况下,指向的在函数和调用站点中是相同的。所以第一个程序做你所期望的。


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

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

如果要获得与第一个程序相同的效果,则需要std::array 通过引用传递:

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

推荐阅读