当前位置: 代码迷 >> 综合 >> c/c++ 实参、形参、值传递、地址传递的区别与关系 ---- 授人以鱼不如授人以渔
  详细解决方案

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

热度:16   发布时间:2024-02-02 09:44:29.0

函数的传递过程详解:

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

 

  相关解决方案