一、定义
传值调用:调用函数时,将实参的值复制给形参,由于形参与实参占用不同的存储单元,导致形参的修改并不会影响实参的值。
传址调用:调用函数时,将实参的地址复制给形参,此时形参、实参指向相同的内存单元,若在函数体中改变了形参值,实参值也会跟着改变。
二、代码分析
#include<stdio.h>
void swap1(int a,int b)
{
printf("swap1()形参地址&a=%d,&b%d\n",&a,&b);//形参属于局部变量,拥有自己的地址
printf("swap1()形参值a=%d,b=%d\n",a,b);
int temp;
temp=a;
a=b;
b=temp;
//值传递。尽管实参值发生改变但不影响实参的值
printf("a=%d,b=%d\n",a,b);
}
void swap2(int *pa,int *pb)
{
printf("swap2()形参自身所在的地址%d,%d\n",&pa,&pb); //指针变量也是变量,“&变量名”
printf("swap2()形参值*pa=%d,*pb=%d\n",pa,pb); //取指针变量保存的内容,即实参的地址
int *temp;
temp=pa;
pa=pb;
pb=temp;
//尽管是址传递,但是对地址作交换而并未对形参值作修改 ,所以实参也未修改
printf("pa=%d,pb=%d\n",*pa,*pb);
}
void swap3(int *pa,int *pb)
{
printf("swap3()形参自身所在的地址%d,%d\n",&pa,&pb);
printf("swap3()形参值*pa=%d,*pb=%d\n",pa,pb);
int temp;
temp=*pa;
*pa=*pb;
*pb=temp;
//址传递,且对形参值做了交换,故实参也跟着改变
printf("pa=%d,pb=%d\n",*pa,*pb);
}
void swap4(int *p1,int *p2)
{
int *temp;//[int *temp=NULL等价于 int *temp=0,不同于int *temp;]
*temp=*p1;//尽管看似会输出正确交换结果,程序编译也没问题,但程序最终会崩溃 。
*p1=*p2;
*p2=*temp;
}
int main()
{
int x=4,y=5;
printf("实参地址&x=%d,&y=%d\n",&x,&y);
printf("实参值x=%d,y=%d\n\n",x,y);
swap1(x,y);
printf("调用swap1():x=%d,y=%d\n\n",x,y);
swap2(&x,&y);
printf("调用swap2():x=%d,y=%d\n\n",x,y);
swap3(&x,&y);
printf("调用swap3():x=%d,y=%d\n\n",x,y);
swap4(&x,&y);
printf("调用swap4():x=%d,y=%d\n\n",x,y);
return 0;
}
运行结果如下: