C语言-值传递、地址传递与引用

[复制链接]
发表于 2022-9-4 09:45:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1、引例

【例1】 分析该程序,有哪些问题
  1. int main()
  2. {
  3.     swap(int p, int q);
  4.     int a = 10, b = 20;
  5.     printf("(1)a = %d, b = %d\n", a, b);
  6.     swap(&a, &b);
  7.     printf("(2)a = %d, b = %d\n", a, b);
  8. }
  9. swap(int p, int q)
  10. {
  11.     int t;
  12.     t = p;
  13.     p = q;
  14.     q = t;
  15. }
复制代码
分析,该程序的功能是将a和b的值通过函数swap()进行交换,最后输出结果,但编译时会发生语法错误。修改意见:1、定义、声明用户自定义函数时,因该对函数添加返回值(即将第9行和第3行修改为void swap(int p, 、int q))。2、由于定义函数swap()时,参数p和q 都为整型,因此当调用该函数时,实际参数也应为整型(即,将第6行改为 swap(a, b))修改后,该程序为
  1. int main()
  2. {
  3.     void swap(int p, int q);
  4.     int a = 10, b = 20;
  5.     printf("(1)a = %d, b = %d\n", a, b);
  6.     swap(a, b);
  7.     printf("(2)a = %d, b = %d\n", a, b);
  8. }
  9. void swap( int p,  int q)
  10. {
  11.     int t;
  12.     t = p;
  13.     p = q;
  14.     q = t;
  15. }
复制代码
程序的运行结果为:可见,虽然程序可以运行,但并没有实现对a和b 的值交换。 2、值传递

2.1 定义

定义 1 (值传递)在调用函数的过程中,只将实参的值赋值(复制)给形参,被调用函数的内部对形参的修改,不会引起实参的变化。
【例2】值传递
  1. int main()
  2. {
  3.     void swap(int p, int q);
  4.     int a = 10, b = 20;
  5.     printf("(1)a = %d, b = %d\n", a, b);
  6.     swap(a, b);
  7.     printf("(2)a = %d, b = %d\n", a, b);
  8. }
  9. void swap( int p,  int q)
  10. {
  11.     int t;
  12.     t = p;
  13.     p = q;
  14.     q = t;
  15. }
复制代码
这种方式叫做值传递。在main函数执行过程中,当执行到调用函数swap(a,b)时,此时main函数跳转到swap函数继续执行,同时将实参a和b的值赋值(复制)给形参p和q,在swap函数内部借助变量t,实现形参p和q值的交换(然而形参p和q值的交换,对实参a和b的值并无影响,该语句只是将实参a和b的值赋值给形参p和q,仅此而已)。当调用函数执行完之后,返回到调用函数swap(a,b)的下一条语句继续执行。
3、地址传递

3.1 定义

定义 2(指针传递)在调用函数的过程中,将实参的地址传递给形参,被调用函数的内部对形参的修改,会同步引起实参的修改。
【例3】地址传递
  1. int main()
  2. {
  3.     void swap(int *p, int *q);
  4.     int a = 10, b = 20;
  5.     printf("(1)a = %d, b = %d\n", a, b);
  6.     swap(&a, &b);
  7.     printf("(2)a = %d, b = %d\n", a, b);
  8. }
  9. void swap( int *p,  int *q)
  10. {
  11.     int t;
  12.      t = *p;
  13.     *p = *q;
  14.     *q = t;
  15. }
复制代码
这种方式叫做指针传递。在执行调用函数的过程中,调用函数swap(&a,&b)将实参a、b的地址赋值给形参p、q,由于p、q为指针,那么p、q所指向的值与a、b的值必然相同(即p、q分别指向a、b)。在调用函数内部,对p、q所指向的值修改,即是对实参a、b值的修改。
4、引用

4.1 定义

定义 3(引用)对某一变量的重命名(别名),对引用的操作等同于对变量的操作。
4.2 声明

类型标识符 &引用名=目标变量名
【例4】
int b;
int &a=b;  // 定义了引用a,即a是变量b 的别名
注:
(1)& 为标识符,不是取地址运算
(2)声明引用的同时,必须同时初始化
(3)当对目标变量声明引用之后,等同于目标变量有一个别名,即 a=1等价于b=1
(4)引用不占存储单元,对引用求地址,等同于对目标变量求地址,即  &a=&b
(5)对数组不能建立引用
4.3 用途

(1)函数参数传递,
用引用传递参数,由于引用不占用内存空间,对引用的修改即是对目标函数的修改,从而提高效率
4.4 与指针的区别

指针是通过指针变量对所指向的值间接操作,使用指针,程序的可理解性变差。而引用时目标变量的别名,对引用的操作就是对目标变量的操作。
【例5】引用传递参数
  1. int main()
  2. {
  3.     void swap(int &p, int &q);
  4.     int a = 10, b = 20;
  5.     printf("(1)a = %d, b = %d\n", a, b);
  6.     swap(a, b);
  7.     printf("(2)a = %d, b = %d\n", a, b);
  8. }
  9. void swap( int &p,  int &q)
  10. {
  11.     int t;
  12.     t = p;
  13.     p = q;
  14.     q = t;
  15. }
复制代码
运行结果
 
 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表