扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
int swap(int *a,int *b)//a与b分别复制主函数x与y的值,即a与x的指向相同,b与y的指向相同
创新互联建站是一家专注于成都网站制作、网站设计、外贸网站建设与策划设计,汾阳网站建设哪家好?创新互联建站做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:汾阳等地区。汾阳做网站价格咨询:028-86922220
{
int *t;
{t=a;a=b;b=t;}//通过交换,a和y的指向相同,b与x的指向相同,但是,x与y没有改变原来指向,这样函数swap结束,a与b消失,输出结果不变
}
换成
int t;
{t=*a;*a=*b;*b=t;}//将改变x和y指向的地址的值,达到交换目的
解答:
1. 注意形式参数和实际参数的区别,主函数中的x,y是实际参数,swap函数中的a,b是形式参数。他们各有自己的存储空间,互不干扰。
2. 在程序适当位置加上输出地址的语句,即可看出为什么回到主程序后,x,y的值为什么不交换。
为了更形象,可以用图表示它们的关系:
可见,交换的只是swap函数中的a,b值,对主函数中的a,b值没有影响。
3. 修改的方法,将swap的交换变成值的交换。
#includestdio.h
void mswap(int *p1, int* p2);//在前边声明一下函数
int main()
{
int a, b, *pa, *pb, swap(int p1, int p2);
scanf("%d%d", a, b);
pa = a; /*指针pa指向整数a*/
pb = b; /*指针pb指向整数b*/
printf("a=%d,b=%d\n", a, b);
mswap(pa, pb); /*调用函数swap,实参为指针*/
printf("a=%d,b=%d\n", a, b);
return 0;//int main()
}
void mswap(int *p1, int* p2)
{
int t;
t = *p1; *p1 = *p2; *p2 = t;
}
我用的vs2013,貌似系统自带swap,会报错。所以把函数名改成了mswap
这个地方会出现不好理解的东西。
调用函数的时候,你放入了int
a
int
b
但是这其实不是你的main函数中的a
b只是相当于他们的副本,也就是复制了一个a
和b
传入函数
所以你改变的只是传入的副本
也就是复制的副本a
b所以在main函数中打印的ab不会出现变化
依然是a=3,b=6
现在回答第二个问题,怎么会让ab的值变化:传入指针,也就是在main函数中使用a
b的指针,然后吧指针传入到函数里面
这个时候ab就会真正的发生变化,因为指针指向的是ab的物理地址,也就是真正的ab,不是副本,这个时候就会改变ab的值。想要理解,可以去百度传值参数和引用参数。纯手打,望采纳
你想通过传递变量地址(即指针)来调用子函数,实现改变变量的值。
这样是做不到的,就像为什么不能通过直接交换形参改变变量的值一样,你把传来的指针(即变量地址)直接交换,并不会对main里面的p和q起作用,就是main里面的地址值实际上并没有交换(你可以用%p打印地址看一下),正确的做法是通过传来的地址,改变对应地址里面的值:
#include stdio.h
void swap(int *a,int *b)
{
int t;
t=*a;*a=*b;*b=t;
}
main()
{
int i=3,j=5,*p=i,*q=j;
swap(p,q);
printf("%d %d\n",*p,*q);
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流