我正在尝试学习如何通过视频课程使用指针和引用,但我发现指针和引用非常复杂。
我正在尝试做一个非常基础的练习,以便了解它的工作原理。看起来像这样:
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)
它运行完美。
谁能解释我为什么?我认为在这种情况下使用指针或引用应该是相同的。两者都将导致阵列。我错了吗?
答案 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值(不是数组),并且该函数可以自由修改该值,因为这些更改将影响调用方函数中的原始变量。
我希望可以澄清差异。