理解值传递,地址传递和引用传递

转载: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 44 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 46 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 46 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

posted @   W-Vicky11  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示