如果数组是通过引用传递的,为什么我应该使用 int(&)[]

问题描述 投票:0回答:1
#include <iostream>
using namespace std;

void Change(int arr[3]) {
    for (int i = 0; i < 3; i++) {
        arr[i] = 1;
    }
}

int Test() {
    int arr[3] = { 0, 0, 0 };

    for (int i = 0; i < 3; i++) {
        cout << arr[i] << endl;
    }

    Change(arr);

    for (int i = 0; i < 3; i++) {
        cout << arr[i] << endl;
    }

    return 0;
}

由于数组默认作为指向其第一个元素的指针传递并且不会被复制,因此更改函数中数组的值实际上会导致函数调用者中数组的值发生更改,这就是上面代码输出的原因

0
0
0
1
1
1

如果是这种情况,那么为什么有人需要传递这样的数组

void Change(int (&arr)[3])

我知道需要括号来使参数成为对数组的引用而不是引用数组,但是我能得到什么?

c++ pass-by-reference pass-by-value function-declaration
1个回答
3
投票

此函数声明

void Change(int arr[3]) {

被编译器调整为

void Change(int *arr) {

因此该函数对传递的数组的大小一无所知。

如果像这样声明函数

void Change(int ( &arr )[3]) {

在函数内,您可以使用标准函数

std::size
获取数组的大小,或者获取其第一个和最后一个迭代器,例如
std::begin( arr )
std::end( arr )
。此外,您可以通过引用模板函数来传递数组,该模板函数通过引用接受其参数,类似于传递任何容器..

© www.soinside.com 2019 - 2024. All rights reserved.