我试试这个简单的程序:
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按来电值传递?
在传递指针的情况下通过值,所述尖在值是在功能和调用点是相同的。所以第一个程序做你所期望的。
在第二个程序中,它是不同的,因为它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)