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

函数的传递过程详解:

值传递:将原始对象的值传递给目标。程序会为目标开辟一个完全相同的内存空间,并将原始对象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 = 43

a = 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 = 55

a = 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
请按任意键继续. . .

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值