1 值传递
函数调用时,为函数的形参分配地址。
同样的,实参也要分配地址,当然与形参的地址不同。
实质就是传值时,实参只是简单把自己的值赋值给形参,形参与实参之间没有关系;
//传数值不会改变原来值的例子。
#include
void swap(int, int); //函数参数采用传数值方式
void main()
{
int a=585, b=696;
swap(a, b); //传数值
printf('In main: a=%d, b=%d\n', a, b); //返回主函数后
printf('In main: a=%#p, b=%#p\n', &a, &b); //返回主函数后
system('pause');
}
//将变量作为参数,以传数值方式传递参数
void swap(int a, int b)
{
int temp=a;
a=b;
b=temp;
printf('In swap: a=%d, b=%d\n', a, b); //在被调函数里
printf('In swap: a=%#p, b=%#p\n', &a, &b); //返回主函数后
}
运行结果:
In swap: a=696, b=585
In swap: a=0X0012FEEC, b=0X0012FEF0
In main: a=585, b=696
In main: a=0X0012FF44, b=0X0012FF40
2 址传递
在传递地址时,系统为指针变量分配地址,指针变量存储的是指向实参的存储地址,所以在被调函数中若改变形参的值,也就改变了原来变量的数值。
传址时,实参的把自己的地址传址给形参,在实参与形参之间通过指针指向建立了逻辑关系。
//传递指针改变实参值的例子。
#include
void swap(int*, int*); //函数参数采用传地址值的方式
void main()
{
int a=585, b=696;
printf('&a=%#p\t &b=%#p\n', &a, &b); //实参地址
swap(&a, &b); //传地址值
printf('返回后数据:a=%d, b=%d\n',a, b);
}
void swap(int *p, int *t)
{
int temp;
printf('&p=%#p\t &t=%#p\n', &p, &t); //指针地址
printf(' p=%#p\t t=%#p\n', p, t); //形参地址
temp=*p; //交换两个变量的值
*p=*t;
*t=temp;
printf('交换数据为:a=%d, b=%d\n', *p,*t);
}
运行结果:
&a=0X0012FF44 &b=0X0012FF40
&p=0X0012FEEC &t=0X0012FEF0
p=0X0012FF44 t=0X0012FF40
交换数据为:a=696, b=585
返回后数据:a=696, b=585
-End-