博客
关于我
c/c++ 实参、形参、值传递、地址传递的区别与关系 ---- 授人以鱼不如授人以渔
阅读量:338 次
发布时间:2019-03-04

本文共 3255 字,大约阅读时间需要 10 分钟。

函数的传递过程详解:

值传递:将原始对象的值传递给目标。程序会为目标开辟一个完全相同的内存空间,并将原始对象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 = 11b = 23输入的 num1 = 11输入的 num2 = 23输出的 num1 = 21输出的 num2 = 43a = 11b = 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 = 22b = 55a = 55b = 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请按任意键继续. . .

 

转载地址:http://ljqe.baihongyu.com/

你可能感兴趣的文章
操作DOM(二):删除节点、、复制节点、替换节点
查看>>
vue(7):表单输入绑定
查看>>
JSP内置对象:操作cookie、session对象
查看>>
【数算-27】多路查找树【了解】
查看>>
【数算-31】【十大常用算法-03】动态规划算法与背包问题
查看>>
【SE-02】多线程-02
查看>>
$set的使用(视图不能实时更新)
查看>>
Spring知识小汇(6)——Bean的自动装配
查看>>
一、硬件防火墙
查看>>
Javaweb jQuery功能练习
查看>>
余生,愿你能靠近那些正能量的人——
查看>>
初学QT
查看>>
IOC容器_Bean管理xml方式
查看>>
python+Aritest自动化—02—app_util.py—app驱动
查看>>
蓝桥杯入门练习题斐波那契数列
查看>>
(Java基础类库 )System类
查看>>
context:include-filter与exclude-filte控制扫描组件
查看>>
【SSL】1072砝码称重
查看>>
js数据结构--队列--常见操作
查看>>
JS数据结构--单向链表--常见操作
查看>>