当前位置:   article > 正文

C语言值传递与地址传递_为什么值传递不改变实参

为什么值传递不改变实参

在我们学习C语言函数部分的时候,书上写的实参向形参的数据传递是‘值传递’,是单向传递,只能由实参传递给形参,而不能由形参传递给实参。由于这个特性,我们可能在写程序时,有些函数内改变了一些值,运行结果会数值却没有发生变化。例如

例一:

当我们学习到指针部分时,会接触到‘地址传递’,会发现有一份类似函数部分的程序却可以改变主函数的参数的数值。这是因为存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。  

将例一的程序改为地址传递。

  1. #include<stdio.h>
  2. int main()
  3. {
  4. void exchange(int *p1,int *p2);//函数声明
  5. int *p1,*p2;
  6. int a=5,b=3;
  7. p1=&a;
  8. p2=&b;
  9. exchange(p1,p2);
  10. printf("主函数a=%d,b=%d\n",a,b);
  11. return 0;
  12. }
  13. void exchange(int *p1,int *p2)
  14. {
  15. int t;
  16. t=*p1;
  17. *p1=*p2;
  18. *p2=t;
  19. printf("函数中a=%d,b=%d\n",*p1,*p2);
  20. }

结果:

可以看到在exchange函数和主函数中,a,b的值都发生了变化。

在这个程序中用指针变量作参数,虽然传送的是变量的地址,但实参和形参之间的数据传递依然是单向的'值传递',即调用函数不可能改变实参指针变量的值。但它不同于一般值传递的是,它可以通过指针间接访问的特点来改变指针变量所指变量的值,最终达到了改变实参的目的。

 

如果不能理解但又想达到交换的效果,比如例一,我们可以把主函数中的输出语句去掉,保留exchange中的输入。这样输出的就为交换后的结果。

同样的,下面这个程序可能会更明显的帮助我们理解值传递和地址传递。

 

#include<stdio.h>
void fun(char *c,int d)
{
	*c=*c+1;
	d=d+1;
	printf("%c,%c\n",*c,d);
}
int main()
{
	char b='a',a='A';
	fun(&b,a);
	printf("%c,%c\n",b,a);
	return 0;
}

运行结果:

 

b,B
b,A
Press any key to continue

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码独立开发者/article/detail/63094
推荐阅读
相关标签
  

闽ICP备14008679号