5分钟搞懂C语言中的传值和传址

C语言文章更新目录

C语言学习资源汇总,史上最全面总结,没有之一
C/C++学习资源(百度云盘链接)
计算机二级资料(过级专用)
C语言学习路线(从入门到实战)
编写C语言程序的7个步骤和编程机制
C语言基础-第一个C程序
C语言基础-简单程序分析
VS2019编写简单的C程序示例
简单示例,VS2019调试C语言程序
C语言基础-基本算法
C语言基础-数据类型
C语言中的输入输出函数
C语言流程控制语句
C语言数组——一维数组
C语言数组——二维数组
C语言数组——字符数组
C语言中常用的6个字符串处理函数
精心收集了60个C语言项目源码,分享给大家
C语言核心技术——函数
C代码是怎样跑起来的?
C语言实现字符串的加密和解密
C语言——文件的基本操作
使用C语言链表创建学生信息并且将信息打印输出
图解C语言冒泡排序算法,含代码分析
实例分析C语言中strlen和sizeof的区别
开发C语言的3款神器,VS2019、VScode和IntelliJ Clion
动图图解C语言选择排序算法,含代码分析
动图图解C语言插入排序算法,含代码分析
C语言指针数组和数组指针详解

C语言实例专栏(持续更新中…)

正文

前段时间公司招人,一个刚毕业的大学生来应聘,其中有道面试题是这样的。

补全下面的函数使其交换x,y的值。

/*
 * @author: 冲哥
 * @date: 2022/4/14
 * @description:交换x,y的值
 * @公众号:C语言中文社区
 */
#include "stdio.h"

//编写swap函数交换x,y的值。
void swap(int x, int y){

}

int main(){
   int x = 20;
   int y = 30;

   printf("调用swap函数前:\nx=%d\ny=%d\n", x, y);
   //调用swap函数

   printf("调用swap函数后:\nx=%d\ny=%d\n", x, y);

   return 0;
}

看到这道题后,这个大学生很快地就开始在答题纸上开始写了,他是这样写的:

/*
 * @author: 冲哥
 * @date: 2022/4/14
 * @description:交换x,y的值
 * @公众号:C语言中文社区
 */
#include "stdio.h"

//编写swap函数交换x,y的值。
void swap(int x, int y){
   int temp;
   temp = x;
   x = y;
   y = temp;
}

int main(){
   int x = 20;
   int y = 30;

   printf("调用swap函数前:\nx=%d\ny=%d\n", x, y);
   //调用swap函数
   swap(x, y);

   printf("调用swap函数后:\nx=%d\ny=%d\n", x, y);

   return 0;
}

思考一下,你的答案和这个大学生相同吗?

我们来看下程序的运行结果:
640

什么?不可能吧,我已经将他们交换了啊?

好了,不要再纠结了,一起分析一下这段代码,为了清楚的说明,我们在swap函数里也加一个输出函数,然后看看结果。

/*
 * @author: 冲哥
 * @date: 2022/4/14
 * @description:交换x,y的值
 * @公众号:C语言中文社区
 */

#include "stdio.h"

//编写swap函数交换x,y的值。
void swap(int x, int y){
   int temp;
   temp = x;
   x = y;
   y = temp;
   printf("swap函数里的x,y交换后:\nx=%d\ny=%d\n", x, y);
}

int main(){
   int x = 20;
   int y = 30;

   printf("调用swap函数前:\nx=%d\ny=%d\n", x, y);
   //调用swap函数
   swap(x, y);

   printf("调用swap函数后:\nx=%d\ny=%d\n", x, y);

   return 0;
}

运行结果:
640 (1)

分析上面的运行结果发现,main()函数中调用swap()函数前后x和y的值并没有改变,但是在swap()函数中交换前后x和y的值的确交换成功了,而在main()函数中为什么没有成功地实现交换呢?为了方便说明,我们用图来展示参数是如何进行传值的。

640 (2)

从图中清楚地发现,在函数的调用过程中实现的是main()函数里参数x和y的传值,即把main()函数里参数x和y的值传递给swap函数里x和y,swap()函数中的x和y拥有自己的存储空间,所以接下来在swap()函数中进行的交换操作仅仅是对swap函数内部x和y进行的,不会影响到main()函数中x和y的值。

那么怎样才能交换main函数里的x和y呢?

我们再来看下面这段代码:

/*
 * @author: 冲哥
 * @date: 2022/4/14
 * @description:交换x,y的值
 * @公众号:C语言中文社区
 */

#include "stdio.h"

//编写swap函数交换x,y的值。
void swap(int *px, int *py){
   int temp;
   temp = *px;
   *px = *py;
   *py = temp;
   printf("swap函数里的*px,*py交换后:\n*px=%d\n*py=%d\n", *px, *py);
}

int main(){
   int x = 20;
   int y = 30;

   printf("调用swap函数前:\nx=%d\ny=%d\n", x, y);
   //调用swap函数
   swap(&x, &y);

   printf("调用swap函数后:\nx=%d\ny=%d\n", x, y);

   return 0;
}

运行结果:
640 (3)

分析上面的运行结果发现,此时不仅在swap()函数中成功交换了*px*py,而且在main()函数中也成功实现了x和y的交换。为了能够更加直观地说明交换的实现,我们用图来展示参数是如何进行传递的。

640 (4)

图中可以清楚地发现,在函数的调用过程中实现的是参数x和y的传址,即把x和y存储单元的地址传递给px和py,swap()函数中的形参不再拥有自己的存储空间,它们分别指向x和y的存储单元,所以接下来在swap()函数中对px和py指向的存储单元进行交换的操作其实是对x和y进行的。这也是在采用传址的时候修改形参也会影响实参的原因。

通过以上实例是不是就能很容易理解C语言的传值和传址,有什么问题欢迎留言。

如果您觉得本篇文章对您有帮助,请转发给更多的人
C语言中文社区】是一个C语言/C++视频教程、学习笔记、电子书、计算机二级资料等专注于C语言/C++编程学习者的干货知识分享平台,精选深度文章,分享优秀干货类、技能类的学习资源,帮助学习中的你。在这里插入图片描述

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言中文社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值