使用引用和指针将数组作为参数传递

时间:2018-10-15 17:16:30

标签: c++ arrays

我正在尝试学习如何通过视频课程使用指针和引用,但我发现指针和引用非常复杂。

我正在尝试做一个非常基础的练习,以便了解它的工作原理。看起来像这样:

void print(int &array, int size)
{
    for (int i = 0; i < size; i++)
    {
        cout << array[i] << " ";
    }
}

int main()
{
    int n, a[10];
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    print(a, 5);
    return 0;
}

它不起作用,因为我要传递一个数组作为参考。如果我将函数原型更改为此

void print(int *array, int size)

它运行完美。

谁能解释我为什么?我认为在这种情况下使用指针或引用应该是相同的。两者都将导致阵列。我错了吗?

2 个答案:

答案 0 :(得分:2)

类型int &array声明array是对单个int变量的引用,而不是对int元素数组的引用。

之所以可以使用指针,是因为数组自然会衰减到指向其第一个元素的指针。即通过a时,您真正传递的是&a[0],其类型为int*

答案 1 :(得分:1)

按值传递 表示将给定的参数复制到具有参数名称的变量。然后可以在函数中访问此变量。因此,当您执行以下操作时:

void MyFunction(int* myptr);

真正传递的是指针的副本。也就是说,它将作为参数给出的指针的值(它拥有的地址)复制到myptr。然后,复制指针访问该地址处的值,该值与原始指针所指向的值相同。 因此,当您这样做时:

void print(int* array, int size);

真正传递的是地址到第一个元素的副本。当您声明这样的数组时:

int array[20];

该数组实际上是一个指针,因此,如果您将其称为:

 *array

然后它将与以下内容相同:

array[0]

通过引用传递 表示传递的值与原始内存在同一位置。

int print(int& array, int size)

此函数只需要一个int值(不是数组),并且该函数可以自由修改该值,因为这些更改将影响调用方函数中的原始变量。

我希望可以澄清差异。