gpt4 book ai didi

C++ - 通过引用传递,数组的奇怪之处

转载 作者:行者123 更新时间:2023-11-30 00:51:13 25 4
gpt4 key购买 nike

据我所知,C++ 使用 Ampersand(&) 来创建引用传递函数。但是我刚刚测试了这段代码,我想知道为什么第二个函数看起来与第一个函数相似。现在看来第二个函数是引用传递函数。

#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 位置的指针。

考虑到理想情况下参数不同,它们有不同的行为

  1. 引用变量的 Sizeof 返回数组的实际大小。
  2. 您不能修改函数内的引用参数。

为了完整起见,这里有一个更新的程序,可以让您更多地了解行为的不同之处。

#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;
}

关于C++ - 通过引用传递,数组的奇怪之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22742294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com