ste*_*ytw 1 c++ function pass-by-reference
据我所知,C++使用Ampersand(&)来制作Pass By Reference函数.但我刚测试了这段代码,我想知道为什么第二个函数与第一个函数看起来相似.现在似乎第二个功能是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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这个吗?谢谢.
将数组传递给函数时,它会退化为指针.所以在任何一种情况下,结果都是一样的.
因此,如果是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;
}
Run Code Online (Sandbox Code Playgroud)