C++中,向函数传递参数有三种方式:
- 传值调用 function call by value
- 指针调用 function call by pointer
- 引用调用 function call by reference
1、传值调用
向函数传递参数的值,即把参数的值复制给函数的形式参数。
这种情况下,修改函数内的形式参数,并不会影响到函数外的实际参数。
#include <iostream>
using namespace std;
void swap_by_value(int x, int y) {
int tmp = x;
x = y;
y = tmp;
cout << "&x: " << &x << ", &y: " << &y << endl;
}
int main()
{
int a = 3;
int b = 7;
cout << "before: a: " << a << ", b: " << b << endl;
cout << "&a: " << &a << ", &b: " << &b << endl;
swap_by_value(a, b);
cout << "after : a: " << a << ", b: " << b << endl;
return 0;
}
运行结果如下图所示,由于形参是实参的拷贝,形参和实参的地址是不同的。因此改变形参的值,并不会影响外部实参的值。
当只在函数内部改变参数,且不希望这个改变影响外部参数时,采用值传递。
2、指针调用
向函数传递参数的指针,即把参数的地址复制给形式参数。
在函数内,该地址用于访问要用到的实际参数,这意味着修改形式参数会影响实际参数。
#include <iostream>
using namespace std;
void swap_by_pointer(int* x, int* y) {
int tmp = *x;
*x = *y;
*y = tmp;
cout << "&x: " << x << ", &y: " << y << endl;
}
int main()
{
int a = 3;
int b = 7;
cout << "before: a: " << a << ", b: " << b << endl;
cout << "&a: " << &a << ", &b: " << &b << endl;
swap_by_pointer(&a, &b);
cout << "after : a: " << a << ", b: " << b << endl;
return 0;
}
运行结果如下图所示,形参为指向实参地址的指针,因此对形参的指向操作,就相当于对实参本身进行操作。
3、引用调用
向函数传递参数的引用,即把引用的地址复制给形式参数。
在函数内,该引用用于访问要用到的实际参数,这也意味着修改形式参数会影响实际参数。
#include <iostream>
using namespace std;
void swap_by_reference(int& x, int& y) {
int tmp = x;
x = y;
y = tmp;
cout << "&x: " << &x << ", &y: " << &y << endl;
}
int main()
{
int a = 3;
int b = 7;
cout << "before: a: " << a << ", b: " << b << endl;
cout << "&a: " << &a << ", &b: " << &b << endl;
swap_by_reference(a, b);
cout << "after : a: " << a << ", b: " << b << endl;
return 0;
}
运行结果如下图所示,形参相当于是实参的“别名”,两者的地址是相同的,因此对形参的操作其实就是对实参的操作。
指针传递和引用传递常用于当一个函数实际需要返回多个值时,可以将需要返回的变量以指针或引用的方式传递给函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了