C语言值传递与地址传递

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

例一:

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

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

#include<stdio.h>
int main()
{
void exchange(int *p1,int *p2);//函数声明
int *p1,*p2;
int a=5,b=3;
p1=&a;
p2=&b;
exchange(p1,p2);
printf("主函数a=%d,b=%d\n",a,b);
return 0;
}
void exchange(int *p1,int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
printf("函数中a=%d,b=%d\n",*p1,*p2);
}

结果:

可以看到在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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值