赞
踩
在我们学习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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。