值传递:

形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

指针传递:

形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

引用传递:

形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

举例:

#include<iostream>
using namespace std;//值传递
void change1(int n){cout << "值传递--函数操作地址" << &n << endl;n++;
}//引用传递
void change2(int & n){cout << "引用传递--函数操作地址" << &n << endl;n++;
}//指针传递
void change3(int *n){cout << "指针传递--函数操作地址 " << n << endl;*n = *n + 1;
}int main(){int n = 10;cout << "实参的地址" << &n << endl << endl;change1(n);cout << "after change1() n=" << n << endl;change2(n);cout << "after change2() n=" << n << endl;change3(&n);cout << "after change3() n=" << n << endl;system("pause");return 0;
}

执行结果为:

实参的地址008FFBB4值传递--函数操作地址008FFAE0
after change1() n=10
引用传递--函数操作地址008FFBB4
after change2() n=11
指针传递--函数操作地址 008FFBB4
after change3() n=12

可以看出,实参的地址为008FFBB4。采用值传递的时候,函数操作的地址是008FFAE0并不是实参本身,所以对它进行操作并不能改变实参的值;再看引用传递,操作地址就是实参地址 ,只是相当于实参的一个别名,对它的操作就是对实参的操作;接下来是指针传递,也可发现操作地址是实参地址。

指针传递的实质:

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针本身的地址值不会变)

指针传递和引用传递一般适用于

函数内部修改参数并且希望改动影响调用者。对比指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改,不像值传递将实参的值拷贝到另外的内存地址中才修改)。

另外一种用法是:当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后的变量,也相当于一个隐式的返回值传递吧。

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

  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. [开源] FreeSql.AdminLTE.Tools 根据实体类生成后台管理代码
  3. mysql中设置字符_MySQL中设置默认字符集的方法
  4. 使用Notepad++打造称心的IDE: Python PHP Perl
  5. STF简单修改实现安卓多机同屏控制
  6. yolov5模型部署:Nvidia使用TensorRT部署yolov5s模型
  7. 矩形液体包装纸箱行业调研报告 - 市场现状分析与发展前景预测
  8. 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost...
  9. Angular 2:Web技术发展的必然选择
  10. datetime只要年月python_Python 的日期和时间处理
  11. 系统集成项目管理工程师(试题分析、考试大纲、教材目录)
  12. mysql 中文本类型有哪些_mysql数据类型有哪些
  13. win7用计算机名无法访问局域网,Win7局域网不能访问的解决方法
  14. Codeforces 1138
  15. 叶檀:别上了美国人的当 加息会给中国致命一击
  16. 前端架构设计第十课 前端数据结构和算法
  17. FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-PU
  18. 用Haskell写的卡普雷尔卡kaprekar黑洞小程序
  19. csh/python/tcl常用功能
  20. ubuntu下安装smba

热门文章

  1. UnsupportedOperationException:can‘t convert to dimension :typx=0x1
  2. java manager 模式_java设计模式之装饰器模式(Decorator)
  3. java多数据源事务处理_springboot整合多数据源解决分布式事务
  4. python速学_【Python杂货铺】速学python基础
  5. 服务器创建新文件夹权限设置密码,在服务器上修改文件夹权限设置密码
  6. 工具篇1-CMDER--windows下工具,模拟linux好用的工具
  7. poythoncode-实战5--excel 文件读取,文本文件,csv文件,存到系统中以大列表方式进行存储
  8. 帆软函数TOIMAGE应用
  9. java 叠加层_java中不可选择的叠加层
  10. windows process activation service 通信_Android四大组件——Service篇