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

Passing an array as a parameter using a reference vs a pointer

本文关键字:数组 参数传递 指针 引用      更新时间:2023-10-16

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

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

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)

它完美地工作。

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

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

它与指针一起使用的原因是数组自然衰减到指向其第一个元素的指针。 即当你传递a时,你真正传递的是&a[0],它是int*类型。

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

void MyFunction(int* myptr);

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

void print(int* array, int size);

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

int array[20];

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

*array

那么它将与

array[0]

按引用传递意味着传递的值引用与原始值相同的内存位置。

int print(int& array, int size)

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

我希望这能澄清其中的区别。