引用作为函数传参(c++)
·
代码:
#include <iostream>
using namespace std;
int countAndSum(int arr[], int size, int target, int& count) {
int sum = 0;
cout << &count << endl;
for (int i = 0; i < size; ++i) {
if (arr[i] == target) {
count++;
sum += arr[i];
}
}
return sum;
}
struct S{
int a, b, c, d, e, f, g;
};
void printS(S& s) {
cout << &s << endl;
cout << s.a << s.b << s.c << s.d << s.e << s.f << s.g << endl;
}
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
int c = 0;
cout << &c << endl;
int sum = countAndSum(arr, 10, 2, c);
cout << sum << " " << c << endl;
S s = { 1,2,3,4,5,6,7 };
cout << &s << endl;
printS(s);
return 0;
}
一、代码执行过程分析
整个程序的执行流程从main函数开始,按顺序执行以下操作:
1. 初始化与准备工作
int arr[] = {1,2,3,4,5,6,7,8,9,0}; // 定义一个包含10个元素的数组
int c = 0; // 定义计数变量c,初始化为0
cout << &c << endl; // 打印c的内存地址(用于后续验证引用特性)
2. 调用countAndSum函数
int sum = countAndSum(arr, 10, 2, c); // 传入数组、长度、目标值2、c的引用
countAndSum函数的作用是统计数组中等于目标值的元素个数,并计算它们的总和,具体执行:
- 函数参数
int& count是main中c的引用(别名),因此cout << &count << endl打印的地址与main中&c完全相同(证明引用与原变量共享同一块内存)。 - 遍历数组
arr(共 10 个元素),判断每个元素是否等于目标值2:- 当
i=1时,arr[1] == 2,满足条件:count++(实际修改的是main中的c),sum += 2(总和变为 2)。 - 其他元素不等于 2,无操作。
- 当
- 循环结束后,返回总和
sum=2。
3. 输出统计结果
cout << sum << " " << c << endl; // 输出:2 1
4. 结构体操作
S s = {1, 2, 3, 4, 5, 6, 7}; // 定义结构体S的变量s并初始化
cout << &s << endl; // 打印s的内存地址
printStruct(s); // 传入s的引用
printStruct函数的作用是打印结构体的地址和成员值,具体执行:
- 函数参数
S& s是main中s的引用(别名),因此cout << &s << endl打印的地址与main中&s完全相同。 - 打印结构体的 7 个成员值:
1 2 3 4 5 6 7。
二、重点:引用作为函数参数的特性与作用
代码中countAndSum的int& count和printStruct的S& s都是引用传递,这是 C++ 中非常重要的参数传递方式,核心特性如下:
1. 引用的本质:变量的 "别名"
引用不是新变量,而是原变量的 "别名",它与原变量共享同一块内存空间。
- 例如:
countAndSum中的count是main中c的别名,两者地址相同,修改count就是修改c。 - 结构体
S的引用s同理,它与main中的s地址相同,是同一个对象。
2. 引用传参的核心作用
(1)直接修改实参的值
值传递(如int count)会创建实参的副本,函数内修改副本不会影响原变量;而引用传递(int& count)可以直接修改原变量。
- 代码中
countAndSum通过count++修改了main中的c,这正是通过引用实现的(如果用值传递,c会始终保持 0)。
(2)避免对象拷贝,提高效率
对于大型对象(如结构体、类),值传递会复制整个对象(占用内存且耗时);而引用传递不需要拷贝,直接操作原对象,效率更高。
- 代码中的结构体
S虽然简单,但如果是包含大量成员的复杂结构体,printStruct(S& s)比printStruct(S s)(值传递)效率高得多。
(3)保证参数的可读性
引用传递的语法比指针更简洁,且避免了指针的空指针风险,代码更易读。
3. 与值传递的对比(以count为例)
| 传递方式 | 函数参数写法 | 是否创建副本 | 能否修改原变量 |
| 值传递 | int count | 是(拷贝c) |
不能(修改的是副本) |
| 引用传递 | int& count | 否(共享内存) | 能(直接修改c) |
总结
修改后的代码通过引用传递实现了两个核心功能:
- 在
countAndSum中修改外部变量c的值,统计目标元素的个数; - 在
printStruct中高效操作结构体对象,避免不必要的拷贝。
引用作为函数参数是 C++ 中优化参数传递、实现数据交互的重要手段,既解决了值传递无法修改实参的问题,又比指针更安全、简洁。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)