我试图学习如何使用视频课程的指针和引用,我发现指针和引用非常复杂。
我试着做一个非常基本的练习,这样我就能知道它是如何工作的。看起来是这样的:
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)它工作得很完美。
有人能解释一下为什么吗?我认为在这种情况下,使用指针或引用应该是相同的。两者都会导致数组。我说错了吗?
发布于 2018-10-15 17:19:10
类型int &array将array声明为对单个int变量的引用,而不是对int元素数组的引用。
它适用于指针的原因是数组自然衰变到指向它们的第一个元素的指针。也就是说,当您传递a时,您真正传递的是&a[0],它是int*类型的。
发布于 2018-10-15 17:39:54
通过值传递意味着将给定的参数复制到具有参数名称的变量。然后,可以在函数中访问该变量。所以当你做这样的事情:
void MyFunction(int* myptr);真正传递的是指针的副本。也就是说,它将作为参数(它所持有的地址)的指针的值复制到myptr。复制指针然后访问该地址的值,该值与原始指针所指向的值相同。所以当你这么做的时候
void print(int* array, int size);真正传递的是地址到第一个元素的副本。当您声明这样的数组时:
int array[20];该数组实际上是一个指针,因此如果您将它称为:
*array那就等于:
array[0]通过引用传递,意味着传递的值与原始值在内存中的位置相同。
int print(int& array, int size)该函数只接受一个int值(而不是数组),该函数可以自由地修改该值,因为这些更改将影响调用方函数中的原始变量。
我希望这能澄清两者之间的区别。
https://stackoverflow.com/questions/52821726
复制相似问题