通过引用传递,数组的奇怪之处
C++ - Pass by Reference, Weird Thing for Array
据我所知,c++使用& &;)来传递引用函数。但是我刚刚测试了这段代码,我想知道为什么第二个函数看起来和第一个函数很相似。似乎第二个函数现在是传递引用函数。
#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
谁能给我解释一下这个?谢谢。 将数组传递给函数时,它会退化为指针。因此,在任何一种情况下,结果都是相同的。
所以在f2
的情况下,b
是一个指针,它指向数组a开始的位置。还要记住数组索引[a[i]
]和指针算术和取消引用[*(a+i)
]是同义表达式。在第二种情况下,你最终更新了传递的原始数组。
现在这两个声明之间有一个微妙的区别。在f1
的情况下,参数b
是对原始数组a
的引用,因此b
仍然是具有源数组所有特性的同一个数组。对于第二个表达式,b
只是一个指针,顺便指向数组a
的位置。
考虑到参数在理想情况下是不同的,它们有不同的行为
- 参考变量的Sizeof返回数组的实际大小。
- 不能在函数内部修改reference参数
为了完整起见,这里有一个更新的程序,它将给你更多关于行为如何不同的想法。
#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;
}
数组总是"通过引用传递"。数组的名称是一个指针
到数组的第一个元素。那么
中的int b[5]
参数第二个函数与int* b
基本相同。
数组默认由指针传递,即数组的基址。因此,在f2()
中,a
的基址被复制到b
中,以便可以通过正常的指针方式从函数中访问它。
当你通过它的引用传递数组时,它不会占用任何额外的内存,它只是重命名它,你仍然可以以相同的方式访问该数组(通过使用给它的别名)你在最初定义它的块。
相关文章:
- 通过指针与数组引用扩展数组索引序列
- 将链表的内容放在数组引用中
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- C 在将数组引用分配给struct时麻烦
- Typedef数组引用
- 通过强制转换创建子数组引用
- 将数组引用 'T(&)[n]' 引用到 'std::array<T, n>' 的内容
- constexpr 数组引用参数
- 寻找有关函数定义和原型中数组引用的说明
- Initializer_list作为非模板上下文中数组引用参数的参数
- 如何使用一个动态创建的一维数组的二维数组引用仅与标准库?
- 如何返回具有大小的POD数组引用
- 在C++中返回数组引用的语法
- 是否可以声明转换函数返回数组引用而不使用typedef
- 自定义到数组引用的转换
- 类数组引用的NullReferenceException
- 数组指针与数组引用之间的差异
- 在c++中传递数组引用
- 使用特征矩阵作为特征数组引用的参数
- 如何从函数传递数组引用