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