详细解读C语言参数传递-值传递和地址(指针)传递区分

本文详细介绍了C语言中函数参数的值传递和地址传递。通过示例代码分析了值传递如何导致局部变量的交换无法影响原始变量,以及地址传递如何实现在函数内部直接修改原始变量的值。强调了指针在地址传递中的关键作用,并提供了完整的代码示例以帮助读者理解这两种传递方式的区别。
摘要由CSDN通过智能技术生成

指针变量作为函数参数 -值传递和地址传递区分

参考谭浩强版本C语言,本书对于函数的参数传递方式一共就介绍了两种:值传递和地址传递
P224页:
从此页开始介绍指针变量作为函数的参数的情况,在这之前,本书的参数传递方式是值传递,也就是参数不涉及到所谓的指针类型,一般函数参数都是变量:

void add(int a,int b);//参数a b都是int类型的变量,不是指针类型,判断为值传递;

何为值传递? 先给大家分析一下值传递:

请大家看一下代码:

1.	void swap1(int x,int y)
2.	{
3.		int temp;
4.		temp = x;
5.		x = y;
6.		y = temp;
7.		printf("x = %d,y = %d\n",x,y);	
8.	}
9.	int main() 
10.	{
11.		int a = 12,b = 24;
12.    swap1(a,b); // 值传递 
13.    printf("a = %d b = %d",a,b);
14.	}


结果如图所示:
在这里插入图片描述

分析:

首选我们都知道main实际上也是一个函数,它的作用范围是 第10行-第14行
swap1也是一个函数,它的作用范围是1-8行
main函数中的变量与swap函数区域中的变量互不冲突的:
程序未执行前:
在这里插入图片描述
当程序执行到第12行时候:
main函数中的变量a把12这个int型数据赋值给swa1中的变量x(变量b对y也是同理),之后后续的在swap1函数中的操作,全是针对swap1函数中的变量x和变量y进行的,与Main函数中的变量a和p没有关系了! ,a和b仅仅起到了赋值的作用!! ! !

在这里插入图片描述
所以swap1中的x和y的交换,实际上是swap1函数中的x和y交换,与main函数中的变量a和b没有关系,而且我们是在main函数中的是 printf(“a = %d b = %d”,a,b); ,当然要输出的是main函数中的变量a和b,

何为地址传递?

在前面一和二章节的基础之上,我们分析下面的例子:

1.void swap2(int* x,int* y)
2.{
3.	int temp;
4.	temp = *x;
5.	*x = *y;
6.	*y = temp;
7.	printf("x = %d y = %d\n",*x,*y);
8.}
9.int main(int argc, char *argv[]) 
10.{
11.	int a = 12,b = 24;
12.	swap2(&a,&b); //地址传递
13.	printf("a = %d b = %d",a,b); 
14.}


**

1.程序未执行前的状态:

这一次我们标注好了Main函数中变量a和变量b的地址,(下面那个打错了,应该是swap2的函数作用区域在这里插入图片描述

.
2. 当程序执行到第12行时候:由于&a和&b代表的是地址,即参数是地址,程序执行的是地址传递的方式,地址传递不同于值传递,此刻的变量a和变量b会把自己的地址传递给变量x和变量y:
在这里插入图片描述
3.那么后续中对swap2函数中的操作:

1.void swap2(int* x,int* y)
2.{
3.	int temp;
4.	temp = *x;// *是代表把指针变量x所存储地址(x当中存储的是2000  也就是main函数中变量a的地址) 的对应内容(地址2000(即变量a的地址)对应的内容是12)交给temp;
5.	*x = *y;//   把指针变量y存储的地址   对应的内容 交给  指针变量x存储的地址  对应的空间
6.	*y = temp;//同上理
7.	printf("x = %d y = %d\n",*x,*y);
8.}

这样实际上在swap2函数中对地址的操作,实际上是在对main函数中的变量内容进行操作,所以最后的结果为:
在这里插入图片描述

更多C语言的注意事项,请大家关注这个文章~,我会不断更新:

C语言程序设计(谭浩强版本)-考研版注意事项-适合考研和C语言入门小白食用

有喜欢算法的小伙伴可以一起关注算法~:

牛客网-面试必刷100题

感谢大家的支持~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵙嵙程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值