swap函数

来源:互联网 发布:蚁群算法matlab 编辑:程序博客网 时间:2024/05/22 14:48

今天上课就真的长知识了,一直以为自己学得还可以,知识面还算有点广,然而这次就打脸了啊;闲话不多说,直接进入主题;

以前看视频学习的时候就记得过这样一句话,
想要利用函数来交换两个数的值,只能传递指针。
然而我误以为只要传递指针就能交换两个数的值。然而错了。事实证明吧;

先看一下传递数值的情况吧;

#include<stdio.h>void swap(int x, int y){    int t;    t = x;    x = y;    y = t;}int main(){    int a, b;    scanf("%d %d",&a, &b);    swap(a, b);    printf("%d %d",a, b);    return 0 ;}

这个都知道的,肯定没有交换成功啊。说一下原因吧;
先说一下,每个变量都对应这一个地址,函数中的变量也是这样的。
再回归正题吧。传递a,b,变成了x,y。然后x,y进行了交换,当函数结束的时候,xy变量的内存也会释放掉,所以并没有将交换的值赋给a,b了。所以这个函数并没有达到交换结果。
我觉得用一个程序可以更好的解释;

#include<stdio.h>void swap(int x, int y){    int t;    t = x;    x = y;    y = t;    printf("%d %d\n",x, y);    printf("%d %d\n\n",&x,&y); //x,y的地址}int main(){    int a, b;    scanf("%d %d",&a, &b);    swap(a, b);    printf("%d %d\n",&a,&b); //a,b的地址    printf("%d %d\n",a, b);    return 0 ;}

应该懂了吧;

再看下一个swap;
传递的是指针变量;

#include<stdio.h>void swap(int * x, int * y){    int t;    t = *x;    *x = *y;    *y = t;}int main(){    int a, b , *pa, *pb;    scanf("%d %d",&a, &b);    pa = &a;    pb = &b;    swap(pa, pb);    printf("%d %d\n",a, b);    return 0 ;}

这个是交换成功的。还是解释一下吧;
这个例子就是我最前面说的那句话的事实吧;想要利用函数来交换两个数的值,只能传递指针;
比较一下这个例子与上面那个交换失败的不同吧;
他传递的是指针变量,然而为什么就成功了呢?
因为传递的是指针变量,相当于传递的是地址,则再根据swap函数,可以理解位swap函数的交换就是交换传递过来地址中的变量。当函数结束,就意味值交换结束,然而这变量的地址并没有释放,因为这是属于主函数的,只是经过swap函数来处理一下这一地址中的变量。
同样的代码来证明一下吧;

#include<stdio.h>void swap(int * x, int * y){    int t;    t = *x;    *x = *y;    *y = t;    printf("%d %d\n",*x, *y);    printf("%d %d\n\n",x,y); }int main(){    int a, b , *pa, *pb;    scanf("%d %d",&a, &b);    pa = &a;    pb = &b;    swap(pa, pb);    printf("%d %d\n",&a,&b);     printf("%d %d\n",a, b);    return 0 ;}

进入正题了。同样传递的是指针然而交换会失败呢?当时真的有点不能理解呢?
其实后面再一想,确实啊,怎么可能会交换ab的值呢;
先看一下它是怎么交换的吧?

#include<stdio.h>void swap(int * x, int * y){    int * t;    t = x;    x = y;    y = t;}int main(){    int a, b , *pa, *pb;    scanf("%d %d",&a, &b);    pa = &a;    pb = &b;    swap(pa, pb);    printf("%d %d\n",a, b);    return 0 ;}

这个代码交换的是地址,根本就没有交换ab的值,发现了吧?
代码证明一下吧;

#include<stdio.h>void swap(int * x, int * y){    int * t;    t = x;    x = y;    y = t;    printf("%d %d\n",*x, *y);    printf("%d %d\n\n",x,y); }int main(){    int a, b , *pa, *pb;    scanf("%d %d",&a, &b);    pa = &a;    pb = &b;    swap(pa, pb);    printf("%d %d\n",&a,&b);     printf("%d %d\n",a, b);    return 0 ;}
1 0
原创粉丝点击