代码:

#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& countmainc的引用(别名),因此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& smains的引用(别名),因此cout << &s << endl打印的地址与main&s完全相同。
  • 打印结构体的 7 个成员值:1 2 3 4 5 6 7

二、重点:引用作为函数参数的特性与作用

代码中countAndSumint& countprintStructS& s都是引用传递,这是 C++ 中非常重要的参数传递方式,核心特性如下:

1. 引用的本质:变量的 "别名"

引用不是新变量,而是原变量的 "别名",它与原变量共享同一块内存空间。

  • 例如:countAndSum中的countmainc的别名,两者地址相同,修改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

总结

修改后的代码通过引用传递实现了两个核心功能:

  1. countAndSum中修改外部变量c的值,统计目标元素的个数;
  2. printStruct中高效操作结构体对象,避免不必要的拷贝。

引用作为函数参数是 C++ 中优化参数传递、实现数据交互的重要手段,既解决了值传递无法修改实参的问题,又比指针更安全、简洁。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐