理解值传递,地址传递和引用传递
转载:https://blog.csdn.net/weixin_44309097/article/details/124086049#:~:text=在c++中,有三种主
值传递
传递的仅仅是值:
void swap(int x,int y){
int tmp=x;
x=y;
y=tmp;
cout<<x<<y<<endl;
}
int main(){
int a=4,b=6;
swap(a,b);
cout<<a<<b<<endl;
}
此代码输出结果为6 4
和4 6
,实际上只是将a,b的值赋值给x和y,a,b的值其实并没有改变。
地址传递
传递的是地址:
void swap(int *x,int *y){
int tmp=*x;
*x=*y;
*y=tmp;
cout<<*x<<*y<<endl;
}
int main(){
int a=4,b=6;
swap(&a,&b);
cout<<a<<b<<endl;
}
此代码输出6 4
和6 4
它将 a 的地址(&a)代入到 x,b 的地址(&b)代入到 y。同上面的值传递一样,函数调用时作了两个隐含的操作:将&a,&b的值赋值给了 x、y。指针 x、y的值已经分别是 a、b 变量的地址值了。接下来,对x、y 的操作当然也就是对 a、b 变量本身的操作了。所以函数里头的交换就是对 a、b 值的交换了,这就是所谓的地址传递
引用传递
void swap(int &x,int &y){
int tmp=x;
x=y;
y=tmp;
cout<<x<<y<<endl;
}
int main(){
int a=4,b=6;
swap(a,b);
cout<<a<<b<<endl;
}
此代码输出6 4
和6 4
,x、y分别引用了 a、b变量。这样函数里头操作的其实就是实参 a、b 本身了,也就是说函数里是可以直接修改到 a、b 的值了。
何时要将string str 改为const string& str?
- 当待拷贝的字符串过大,使用string str会造成内存和时间的浪费
- 当传递的值不能修改时,则会在string& str前增加一个const,以此来避免编程过程中在函数中对str的误修改
例如:
//值传递
void processString(string digits) {
digits[0] = 'X'; // 可以修改
cout << digits << endl;
}
int main() {
string s = "hello";
processString(s);
cout << s << endl; // 原来的字符串没有被修改
}
输出:xello
hello
//引用传递
void processString(const string& digits) {
// digits[0] = 'X'; // 错误,const 不允许修改内容
cout << digits << endl;
}
int main() {
string s = "hello";
processString(s);
cout << s << endl; // 原来的字符串也没有被修改
}
输出:hello
hello
分类:
代码随想录算法训练营
, C++学习笔记
标签:
leecode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统