据我所知,C ++使用Ampersand(&)来制作Pass by Reference Function。但我刚测试了这段代码,我想知道为什么第二个函数与第一个函数看起来相似。看来第二个函数现在是Pass by Reference Function。
#include <iostream>
using namespace std;
void f1(int (&b)[5])
{
b[0]=1;
}
void f2(int b[5])
{
b[1]=2;
}
int main()
{
int a[5];
f1(a);
f2(a);
cout<<a[0]<<endl;
cout<<a[1]<<endl;
}
输出:
1
2
任何人都能解释一下这个吗?感谢。
答案 0 :(得分:5)
将数组传递给函数时,它会退化为指针。所以在任何一种情况下,结果都是一样的。
因此,在f2
的情况下,b
是一个指针,指向数组a的相同位置。还记得数组索引[a[i]
]和指针算术和解引用[*(a+i)
]是同义表达式。因此,在第二种情况下,您最终会更新传递的原始数组。
现在两个声明之间存在细微差别。如果是f1
,则参数b
是对原始数组a
的引用,因此b
仍然是具有源数组的所有特征的相同数组。如果是第二个表达式,b
只是一个偶然指向数组a
位置的指针。
考虑到参数理想地不同,它们具有不同的行为
为了完整起见,这里有一个更新的程序,可以让您更好地了解行为的不同之处。
#include <iostream>
using namespace std;
void f1(int (&b)[5])
{
std::cout<<sizeof(b)<<std::endl;
//b = new int[5]; -- Will give compile error
b[0]=1;
}
void f2(int b[5])
{
std::cout<<sizeof(b)<<std::endl;
//b = new int[5]; -- Will compile fine
b[1]=2;
}
int main()
{
int a[5];
f1(a);
f2(a);
cout<<a[0]<<endl;
cout<<a[1]<<endl;
}
答案 1 :(得分:1)
数组总是“通过引用传递”。数组的名称是指针
到数组的第一个元素。所以参数int b[5]
在中
第二个函数与int* b
基本相同。
答案 2 :(得分:0)
默认情况下,指针传递数组,即数组的基址。
所以在f2()
中,a
的基址被复制到b
,这样就可以以正常的指针方式从函数中访问它。
当你通过它的引用传递数组时,它不占用任何额外的内存它只是重命名它,你仍然可以以相同的方式访问该数组(通过使用给它的别名)你有在最初定义它的块中..
希望它有所帮助...