zoukankan      html  css  js  c++  java
  • 函数参数的传值与传址

    在如下的主函数里面调用swap函数,问哪一个才能正确交换a,b两变量的值?
    int main()
    {
        int a=3,b=5;
        int *pointer_1 = &a;
        int *pointer_2 = &b;
        swap(pointer_1,pointer_2);
        printf("%d %d",*pointer_1,*pointer_2);
        return 0;
    }

    /**
    swap1是正确的,通过地址传递参数,令pointer_1和pointer_2两个指针变量所指向的变量的值发生了改变。
    */
    swap1(int *p1,int *p2)
    {
        int temp;
        temp = *p1;
        *p1 = *p2;
        *p2 = temp;
    }

    /**
    swap2运行时,系统容易出问题。其实它在原理上是正确的,和swap1一样,但是*temp是指针变量temp所指向的变量(该变量应该是系统中

    已经存在的了),但temp中并没有确定的地址值,它的值是不可预见的,故*temp所指向的单元也是不可预见的。因此,对*temp赋值可能会破

    坏系统的正常工作状况。所以还是要像swap1一样,重新定义一个临时变量temp。
    */
    swap2(int *p1,int *p2)
    {
        int *temp;
        *temp = *p1;
        *p1 = *p2;
        *p2 = *temp;
    }

    /**
    swap3视图通过改变形参的值来改变指针实参的值,犯了一个错误:C语言中实参变量和形参变量之间的数据传递是按单向的“值传递”方式
    通过swap3方法,结果只是令形参p1指向了b,p2指向了a,但是原来的实参指向仍然没有变化。
    */
    swap3(int *p1,int *p2)
    {
        int *p;
        p  = p1;
        p1 = p2;
        p2 = p;
    }

    /**
    swap4是初学者最易犯的错误,原因就是和swap3一样:只是形参的数据发生了改变,而实参并没有变化
    */
    swap4(int x,int y)
    {
        int temp;
        temp = x;
        x = y;
        y = temp;
    }

  • 相关阅读:
    学习WEB基础知识(2)
    HTMLform表单的学习
    osg渲染到纹理的代码,把读入的节点当成纹理渲染到一个正方形上
    提取旋转矩阵
    osg选取
    osg,由eye,center,up生成的左乘,右手坐标系的矩阵
    相机沿着场景旋转
    贝塞尔曲线递归
    贝赛尔曲线,四点控制
    得到相交的三角面片的三个顶点坐标
  • 原文地址:https://www.cnblogs.com/wujiyang/p/4337968.html
Copyright © 2011-2022 走看看