标签:传址 调用 temp int pb pa printf 实参 浅析
一、定义
传值调用:调用函数时,将实参的值复制给形参,由于形参与实参占用不同的存储单元,导致形参的修改并不会影响实参的值。
传址调用:调用函数时,将实参的地址复制给形参,此时形参、实参指向相同的内存单元,若在函数体中改变了形参值,实参值也会跟着改变。
二、代码分析
#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;
}
运行结果如下:
标签:传址,调用,temp,int,pb,pa,printf,实参,浅析 来源: https://blog.csdn.net/Mr_IOT/article/details/87983812
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。