函数的传递过程详解:

值传递:将原始对象的值传递给目标。程序会为目标开辟一个完全相同的内存空间,并将原始对象copy到目标中,之后对目标内存进行修改。所以目标的修改并不会影响原始对象,因为原始对象和目标根本是两个不同的内存空间。

地址传递:将原始对象的指针传递给目标。就是把原始对象在内存中的地址传递给目标,而目标通过寻址进行操作。就是说地址传递时,原始对象和目标对应同一块内存空间,对目标进行修改,就是对原始对象的修改,两者会同时发生变化。

(原始对象  --  程序的实参。目标  --  程序的形参

----------------------------------------------------------------------------------------------------------------------------------------------------------

从编程使用的角度说,值传递类似于只开放读权限,不开放写权限。而地址传递相当于读/写权限。实则不然。

实质是传递地址和传递值带来的区别:值传递并不传递地址,我只能使用送来的值,并不知道值的原始位置,也不知道相邻值的位置。而我知道了原始值的位置,就可以根据数据类型推算出相邻值的位置,便可以用指针去获取相邻的值。

值传递和地址传递的关系,用一句话来说就是:“ 授人以鱼不如授人以渔 ”。

值传递就像代购,我会给你想要的东西,但我不告诉你该去哪儿买。

地址传递相当于告诉了去哪儿买,而通过买的位置,不仅可以买到以前想买的,我还可以找到其他相似的产品。

区别

值传递是复制一块相同的内存空间,并在新复制出来的内存进行操作,而其中的复制会花时间,也会占一段时间的内存。

地址传递则是通过实参的指针直接寻址操作,并不会占用内存的过程。

所以如果值传递和地址传递实现的功能一致的话,地址传递的执行效率会高一些。

----------------------------------------------------------------------------------------------------------------------------------------------------------

理论理解的话就说这么多,下面搞几个例子看看:

值传递:

#include <iostream>
using namespace std;// 函数定义
int test1(int num1, int num2)
{cout << "输入的 num1 = " << num1 << endl;cout << "输入的 num2 = " << num2 << endl;cout << endl;num1 += 10;num2 += 20;cout << "输出的 num1 = " << num1 << endl;cout << "输出的 num2 = " << num2 << endl;cout << endl;return 0;
}int main() {// a,b称为 实际参数,简称实参int a = 11, b = 23;cout << "a = " << a << endl;cout << "b = " << b << endl;cout << endl;// 调用add函数test1(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;cout << endl;system("pause");return 0;
}
----------------------------------------------------------------------
a = 11
b = 23输入的 num1 = 11
输入的 num2 = 23输出的 num1 = 21
输出的 num2 = 43a = 11
b = 23请按任意键继续. . .

地址传递:

int swap(int * num1, int * num2)
{int xtemp = *num1;*num1 = *num2;*num2 = xtemp;return 0;
}int main() {int a = 22;int b = 55;cout << "a = " << a << endl;cout << "b = " << b << endl;cout << endl;swap(&a, &b);cout << "a = " << a << endl;cout << "b = " << b << endl;cout << endl;system("pause");return 0;
}
---------------------------------------------------------
a = 22
b = 55a = 55
b = 22请按任意键继续. . .

结构体的值传递:

struct student
{// 成员列表string name;    // 姓名int age;   // 年龄int score; // 分数
};void printStudent(student stu)
{cout << "姓名:" << stu.name<< "  年龄:" << stu.age<< "  分数:" << stu.score << endl;stu.name = "无";stu.age = 0;stu.score = 0;
}int main() {student xiaoMing = { "小明", 18, 96 };printStudent(xiaoMing);cout << "姓名:" << xiaoMing.name<< "  年龄:" << xiaoMing.age<< "  分数:" << xiaoMing.score << endl;system("pause");return 0;
}
---------------------------------------------------------------------------
姓名:小明  年龄:18  分数:96
姓名:小明  年龄:18  分数:96
请按任意键继续. . .

结构体的地址传递:

struct student
{// 成员列表string name;    // 姓名int age;   // 年龄int score; // 分数
};void printStudent(student * stu)
{cout << "姓名:" << stu->name<< "  年龄:" << stu->age<< "  分数:" << stu->score << endl;stu->name = "无";stu->age = 0;stu->score = 0;
}int main() {student xiaoMing = { "小明", 18, 96 };printStudent(&xiaoMing);cout << "姓名:" << xiaoMing.name<< "  年龄:" << xiaoMing.age<< "  分数:" << xiaoMing.score << endl;system("pause");return 0;
}
--------------------------------------------------------------------------
姓名:小明  年龄:18  分数:96
姓名:无  年龄:0  分数:0
请按任意键继续. . .

c/c++ 实参、形参、值传递、地址传递的区别与关系 ---- 授人以鱼不如授人以渔相关推荐

  1. c语言值传递 地址传递 引用传递参数,C++参数传递(值传递,引用传递)

    值传递 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 在函数结束返回后,形参被丢弃释放,实参的内容不会被改变 数据值传递和地址值传递 数 ...

  2. 值传递 引用传递(传地址,传引用)的区别

    传值      是把实参的值赋值给行参      那么对行参的修改,不会影响实参的值           传地址      是传值的一种特殊方式,只是他传递的是地址,不是普通的如int      那么 ...

  3. Python 值传递与地址传递总结

    文章目录 一.复习巩固 1.值传递 2.地址传递 二.代码实例讲解: 三.归纳总结 一.复习巩固 首先我们复习一下什么叫做值传递,什么叫做地址传递 1.值传递 在实参向形参传递的过程中,传递的只是实参 ...

  4. 对几种传递的理解:值传递,地址传递,引用传递

    对几种传递的理解:值传递,地址传递,引用传递 因为会用到形参和实参的概念,区别一下,形参 即在定义函数时 int add(int a , int b)中a,b,即为形参.而当调用时int(3,4)中3 ...

  5. C语言中函数参数传递的方式:值传递,地址传递

    ** C语言中函数参数传递的方式:值传递,地址传递 ** 值传递:将实参的值复制至形参的相应存储单元中,实参与形参占用不同存储单元,单向传递 地址传递:使用数组名或者指针作为函数参数,传递的是该数组的 ...

  6. 值传递,地址传递,引用传递

    值传递 值传递的实质 将实参的值(a.b)复制到形参(m.n)相应的存储单元中,即形参和实参分别占用不同的存储单元. 值传递的特点 值传递的特点是单向传递,即主调函数被调用时给形参分配存储单元,把实参 ...

  7. Go 学习笔记(15)— 函数(01)[函数定义、函数特点、多值返回、实参形参、变长参数,函数作为参数调用]

    1. 函数定义 Go 语言最少有个 main() 函数.函数声明告诉了编译器函数的名称,返回类型和参数. func funcName(parameter_list)(result_list) {fun ...

  8. 【C/C++】值传递和址传递区别解析

    概述: 首先我们要知道 "a的地址"和"a地址中的内容"的区别,数据是存放在内存中的,每一个变量都有一个内存地址, 变量的内容存放在对应内存地址的空间中 比方说 ...

  9. 每日C语言代码(The fourth day)——冒泡排序与地址传递

    今天来分享一个冒泡法,也是很常见的一种C语言算法. 首先我们先来看代码 题目前提:输入10个数,将10个数升序(从小到大)或降序(从大到小)排列 在这里是升序. #include<stdio.h ...

最新文章

  1. java togglebutton_Java ToggleButton.setId方法代码示例
  2. 图像像素点赋值_医学图像处理教程(五)——医学图像边缘检测算法
  3. jboss7 java版本,jdk 1.7推荐使用什么社区版本的Jboss以及为什么
  4. Android 的Google+平台
  5. sqlserver exec查询存储过程取某一个字段_ORC文件存储格式的深入探究
  6. Dubbo使用Zooker注册服务
  7. FFmpeg图像处理深度应用
  8. python count函数用法 comm_python3:MySQL 8.0学习笔记(第五部分:单表查询操作)
  9. Spring注解——使用@ComponentScan自动扫描组件
  10. 计算机视觉,凉了?!
  11. 0505.Net基础班第十三天(面向对象多态)
  12. C#图片动画效果(旋转360度)异步
  13. Linux基础命令---ftp
  14. 期货结算 期货算法公式
  15. 画图软件gliffy
  16. 北通G3游戏手柄开箱体验,原来手游高手都是这么成就的
  17. python九宫格拼图游戏
  18. zemax光学设计高阶优化
  19. 如何对 Excel 中的数据使用 SQL 查询
  20. Css中路径data:image/png;base64的用法详解与操作

热门文章

  1. IE9 以下版本浏览器兼容HTML5的方法,使用的静态资源的html5shiv包:
  2. codeforce Gym 101102A Coins (01背包变形)
  3. 手动挖第一桶金,10日赚3十万元
  4. 【重识 HTML + CSS】基本 CSS 属性
  5. kali使用msf 通过ms17_010_eternalblue(永恒之蓝)漏洞攻击win7测试 及乱码问题解决
  6. 安装Whl文件时提示 ....whl is not a valid wheel filename
  7. git提示(拷贝密钥问题)“Load key /home/devid/.ssh/id_rsa: bad permissions”
  8. 史丹·温斯坦称傲牛熊市的秘密
  9. virmach主机购买和使用
  10. 知乎万赞回答:什么工具能做可视化大屏,还能做数据地图?