gpt4 book ai didi

c++ - 经典数组与 std::array

转载 作者:行者123 更新时间:2023-12-01 14:03:43 26 4
gpt4 key购买 nike

我试试这个简单的程序:

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在调用中按值传递?

最佳答案

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

在第二个程序中,它是不同的,因为 std::array具有值语义,因此按值传递它意味着您也在传递所有底层内存的拷贝。
请注意,在第二个程序的代码中,0 的结果不保证。您正在返回一个指向复制 std::array 中的值的指针当函数返回时它将死亡。这会调用未定义的行为。
如果想得到和第一个程序一样的效果,需要通过std::array改为引用:

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

关于c++ - 经典数组与 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63378914/

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