C++ 经典数组vs std::数组
我尝试这个简单的程序:C++ 经典数组vs std::数组,c++,arrays,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; } 第一次
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;
}
第一次打印50,第二次打印0
std::array
在调用中是否按值传递?在按值传递指针的情况下,函数和调用站点中指向的值是相同的。因此,第一个程序实现了您的期望
在第二个程序中,它是不同的,因为
std::array
具有值语义,所以按值传递它意味着您也在传递所有底层内存的副本
请注意,在第二个程序中的代码中,不保证0
的结果。您正在返回一个指针,指向复制的std::array
中的一个值,该值将在函数返回时消失。这将调用未定义的行为
如果希望获得与第一个程序相同的效果,则需要通过引用传递std::array
:
int*getElement(std::array&arrayy,int索引){
//^参考
返回并排列[索引];
}
默认情况下,C++中的所有内容都是通过值传递的。即使是传统的数组示例也会按值传递指针。当然,您可以使用指针来更改它指向的对象
您的代码实际上具有未定义的行为,因为您返回的指针指向已销毁的对象的内部,即getElement
的arrayy
参数,该参数在退出函数时被销毁
如果你想通过引用传递,你必须请求它
int* getElement(std::array<int, 4>& arrayy, int index) {
return &arrayy[index];
}
int*getElement(std::array&arrayy,int索引){
返回并排列[索引];
}
参数类型名称后面的和会产生很大的差异
std::数组是否在调用中传递值
对。这样做的能力(传递并返回对象)本质上就是std::array存在的原因
因此,函数参数是函数的本地参数,您返回一个指向该本地对象的指针,该指针在函数返回后立即变为无效指针。否。
您的代码是错误的,因为您将std::array
作为值传递
您可能希望通过引用传递它,如下所示:
int* getElement(std::array<int, 4> &arrayy, int index);
int*getElement(std::array&arrayy,int-index);
“std::array是否在调用中通过值传递?”:是的。@FrançoisAndrieux woops,是的,我的错。我认为arrayy[]
和std::array
都是调用中的指针,事实上它们都是数组:pNo,只有array[]
衰减为指针,std::array
没有。
int* getElement(std::array<int, 4> &arrayy, int index);