int swap(int *a,int *b)//a与b分别复制主函数x与y的值,即a与x的指向相同,b与y的指向相同
成都一家集口碑和实力的网站建设服务商,拥有专业的企业建站团队和靠谱的建站技术,十多年企业及个人网站建设经验 ,为成都超过千家客户提供网页设计制作,网站开发,企业网站制作建设等服务,包括成都营销型网站建设,品牌网站设计,同时也为不同行业的客户提供成都网站设计、成都网站建设、外贸网站建设的服务,包括成都电商型网站制作建设,装修行业网站制作建设,传统机械行业网站建设,传统农业行业网站制作建设。在成都做网站,选网站制作建设服务商就选创新互联建站。
{
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指向的地址的值,达到交换目的
在C语言中,通过函数参数传递,进行两个数的交换,必须采用传递指针的方式,同时,在函数中,一定要对两个指针中的数据内容进行交换才能达到交换实参地址中数据的目的。
如:
//正确的交换函数
void swap1(int *p1,int *p2)
{
int p;
p=*p1; //通过*引用地址中的数据,进行交换
*p1=*p2;
*p2=p;
}
//错误的交换函数
void swap2(int *p1,int *p2)
{
int *p;
p=p1; //这里进行改变的是形参的值,而形参只是实参的一个副本,形参本身的变化,是不能改变实参的值的!!
p1=p2;
p2=p;
}
PS:要正确认识C语言中的实参与形参,形参在使用中只是实参的副本,若形参是指针,我们可以通过形参改变实参地址中的内容,但无法改变实参本身的值!
#include stdio.h
void Swap(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
printf("a=%d,b=%d\n",a,b);
}
int main()
{
int a = 5;
int b = 10;
printf("a=%d,b=%d\n",a,b);
Swap(a,b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
扩展资料:
形参和实参的特点
1、形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
2、实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
3、实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误。
4、在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。而在引用调用的机制当中是将实参引用的地址传递给了形参,所以任何发生在形参上的改变实际上也发生在实参变量上。
参考资料:
百度百科-形参
因为指针a b是指向指针p q的,所以写成a b的时候只是单纯的指向p q它们所在的地方,而不是指向 i j的地方,也就相当于指针p q换了个位置,使得a指向q也就指向j,b指向p也就指向i,但是i,j自己的值并没有变化。那么void swap(int *a,int *b)函数对应的swap(p,q);的值是5,3。但是因为:只是p和q交换了位置,自己本身,但是没有牵扯到它们所指的地址,也就是p还是指i,q还是指j。
所以最后*p,*q这两个指针所指的值还是3,5。