函数的传递过程详解:
值传递:将原始对象的值传递给目标。程序会为目标开辟一个完全相同的内存空间,并将原始对象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
请按任意键继续. . .