转自:http://hi.baidu.com/lewutian/blog/item/16436cfabb8a99d5b58f3158.html

C++中值传递、指针传递、引用传递的总结 收藏 
1. 值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

void swap(int a,int b)
{
     int temp;
     temp=a;
     a=b;
     b=temp;
     cout<<a<<’ ‘<<b<<’\n’;
}

int main(){
     int x=1;
    int y=2;
    swap(x,y);
    cout<<x<<’ ‘<<y<<’\n’;
    
    return 0;
}

用gdb调试后发现,x,y的地址分别是0xffbef938, 0xffbef934, 值分别是1,2。而形参a,b的地址分别是0xffbef918,0xffbef914, 虽然它们存储的值和x,y一样,都是1,2,但是这只是拷贝过来的。swap只交换了a,b,并不会改变x,y的值。输出为2,1;1,2

2. 指针传递:

void swap(int *a,int *b)
{
     int temp;
     temp=*a;
     *a=*b;
     *b=temp;
     cout<<*a<<’ ‘<<*b<<’\n’;
}

int main(){

int x=1;
    int y=2;
    swap(&x,&y);
    cout<<x<<’ ‘<<y<<’\n’;

}

输出结果是2,1;2,1。实参x,y, 形参a,b的地址同上,但是a,b的内容分别为0xffbef938(x的地址),0xffbef934(y的地址),*a也就是0xffbef938内存中存放的内容,即x的值1。简单地说,a是一个指向外部实参地址的指针,*a是指针的内容,如果改变了*a也必然导致外部实参的改变。

3. 引用传递:

void swap(int &a,int &b)
{
     int temp;
     temp=a;
     a=b;
     b=temp;
     cout<<a<<’ ‘<<b<<’\n’;
}

int main(){
    
    int x=1;
    int y=2;
    swap(x,y);
    cout<<x<<’ ‘<<y<<’\n’;
    return 0;
}

输出是2,1;2,1。实参x,y的地址同上。然而与指针传递不同的是,形参a,b的地址也与x,y相同,即0xffbef938, 0xffbef934。这样一来,交换a,b就相当于交换x,y。

指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者。对比值传递,指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改,不像值传递将实参的值拷贝到另外的内存地址中才修改)。指针/引用传递的另外一种用法是:当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后的变量,也相当于一个隐式的返回值传递吧。

至于指针/引用传递的格式,可以参考以下的内容:

int x=1;

int *y=&x; //用于指针传递,y有自己独立的内存地址,存储的内容是x的地址,*y是x的值

int &z=x; //用于引用传递,可以理解为z就是x,x就是z,只不过名字不一样

最后再啰嗦一个例子:

int change1(char* name){
    name=”alter”;
    return 1;
}

int change2(char* &name){
    name=”alter”;
    return 1;
}

int main(){
    char* string=”original!”;
    change1(string);
    cout<<string<<’\n’;

change2(string);
    cout<<string<<’\n’;

}

结果:original!;alter。change1是值传递,形参name有自己独立的内存地址,内容是拷贝string的内容(string的内容是”original”的地址),修改后name的内容变成了“alter”的地址。change2是引用传递,形参name的地址就是string的地址,或者说name就是string

转载于:https://blog.51cto.com/568464209/1721076

值传递、指针传递、引用传递的区别相关推荐

  1. qt槽函数如何传递多个参数_【Qt】信号和槽对值传递参数和引用传递参数的总结...

    在同一个线程中 当信号和槽都在同一个线程中时,值传递参数和引用传递参数有区别: 值传递会复制对象:(测试时,打印传递前后的地址不同) 引用传递不会复制对象:(测试时,打印传递前后的地址相同) 不在同一 ...

  2. 【Qt】信号和槽对值传递参数和引用传递参数的总结

    在同一个线程中 当信号和槽都在同一个线程中时,值传递参数和引用传递参数有区别: 值传递会复制对象:(测试时,打印传递前后的地址不同) 引用传递不会复制对象:(测试时,打印传递前后的地址相同) 不在同一 ...

  3. [转载] java中对象作为参数传递给一个方法,到底是值传递,还是引用传递

    参考链接: 用Java传递和返回对象 看完绝对清晰~ java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型  值传递:引用类型,地址值传递,所 ...

  4. 值传递,还是引用传递(实践是检验真理的唯一标准)

    package com.c9;import java.util.ArrayList;//值传递,还是引用传递? /* 1, list,保持一致:有效2,实体bean,保持一致,有效3, string, ...

  5. 递归中的引用传递和常引用传递

    通过递归加深引用传递和常引用传递的区别,同时加深递归回溯的过程 void process(string& str) {if (str.size() >= 5) {cout << ...

  6. 【基础中的基础】引用类型和值类型,以及引用传递和值传递

    一直在博客园怼人,非常惭愧.所以郑重决定: 好好写一篇干货,然后再接着怼人. 这是一起帮上陈百万同学的求助,讲了一会之后,我觉得很有些普世价值,干脆就发到园子来.面向小白,高手轻拍. 我们从最简单的说 ...

  7. java还值_Java到底是引用传递还是值传递

    前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test(){ String str = "hello"; change(str); S ...

  8. 什么是值传递?什么是引用传递?

    值传递是传递变量的值,并不会改变方法外变量的值:引用传递是传递对象的地址,会改变对象本身的值: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用 ...

  9. Java 函数传递对象是引用传递还是值传递?

    class A {int val; }public class main {public static void fun(A a, A b) {// a.val = 6;a = b;}public s ...

  10. 指针与引用有什么区别?

    指针(Pointer)持有另一个对象的地址,使我们能够间接地操作这个对象.引用(Reference)有时候又称为别名,它可以用作对象的另一个名字.它们都是让你间接引用其他对象. 从语法的角度比较,二者 ...

最新文章

  1. 新浪微博推广网站的一些实践体会
  2. 用友服务器整体迁移--数据库附加
  3. domino大百科常见问题总汇1(转载)
  4. spring-java.lang.stackOverFlowError
  5. windows进程管理器_软件进程自动重启一遍又一遍……你需要这款自动杀进程的小公举ProcessKO...
  6. 《Windows驱动开发技术详解》读书笔记(一)
  7. 石家庄学院c语言试题,谁会高级语言程序设计?要求用C语言,帮帮我把,愁死我啦...
  8. java File类入门学习
  9. 「版本升级」MyEclipse CI 2018.12.0正式发布
  10. 20个Flutter实例视频教程-01节底部导航栏和切换效果的制作-1
  11. 网页无法保存html文件,怎么保存无法保存的网页
  12. 使用计算机能播放音乐也能观看视频,我电脑可以放歌有声音。怎么播放视频没声音啊?给我解决方案...
  13. 企业微信定时发送图片/文字信息
  14. excel表格怎么恢复?常见的恢复方法
  15. 饥荒联机版 服务器未响应,饥荒联机版常见问题汇_饥荒联机版常见问题大全_快吧单机游戏...
  16. 读书笔记-定时询问寻求帮助
  17. windows常用 API函数
  18. TaLib金融工具库
  19. 计算两个向量的互信息(Mutual Information) matlab程序
  20. python 主程序等待 子线程_Python多线程中主线程等待所有子线程结束的方法

热门文章

  1. java中InputStream和OutputStream的使用场景
  2. 在Docker中运行Dubbo应用
  3. 用泛型实现参数化类型
  4. Ubuntu14.04安装GitLab指南
  5. hive修改 表/分区语句
  6. 红帽目录服务的数据导入导出
  7. Symbian,倒在3G的门槛上
  8. CSS+DIV-公司网站
  9. linux systemd服务,systemd服务管理
  10. 【Python基础】14_Python中的TODO注释