美文网首页C/C++学习笔记
C/C++参数传递方式总结

C/C++参数传递方式总结

作者: 零岁的我 | 来源:发表于2019-12-16 18:36 被阅读0次

    直接上代码了,原理讲解都放在代码注释里了

    #include<iostream>
    using namespace std;
    /*地址传递:两个形参是指针变量
    函数调用时传递给形参的是实参的地址,例如&m,&n,
    函数执行结果是:指针的指向并没有改变,改变的是指针指向地址的内容
    地址传递实际上也是值传递,只不过传递的是参数的地址,
    由于内存空间的唯一指向性,实参和形参都会指向同一个内存单元,
    因此相残所指向内存单元发生变化,实参所指向内存单元也会发生变化。
    */
    void goodswap(int *a,int *b)
    {
        int temp;
        temp=*a;
        *a=*b;
        *b=temp;
    }
    
    /*这是一个有问题的函数
    temp是一个临时指针变量,并且没有进行初始化,也就是指针temp所指向的单元是不可预见的
    对*temp赋值就是对一个未知的存储单元赋值,而这个未知的存储单元可能存储着一个有用的数值
    这样就有可能破坏系统的工作状态
    */
    void badswap(int *a,int *b)
    {
        int *temp;
        *temp=*a;
        *a=*b;
        *b=*temp;
    }
    
    /*值传递
    实参是通过值传递给函数的,这意味着形参接受的只是发送给他们的值的副本,他们存储在函数的本地内存中,
    对形参值进行任何改变都不会影响原始实参得值。
    函数执行结果:形参变量内容互换了,就是a和b互换了,但是实参变量并没有发生改变;
    由于实参变量与形参变量之间是单向的“值传递”方式,也就是实参可以传递给形参,但是形参不能再回传给实参
    形参改变的只是实参的副本,因此形参值的改变不能使实参随之改变
    */
    void errorswap(int a,int b)
    {
        int temp;
        temp=a;
        a=b;
        b=temp;
    }
    
     /*
     因为C语言单向传递的特性,
     想要把形参a和b return给实参m,n是做不到的,因为C/C++函数不能有多个返回值,除非使用引用传递的方式
     */
    int fakeswap(int a,int b)
    {
        int temp;
        temp=a;
        a=b;
        b=temp;
        return a,b;
        //return b;  //只能有一个返回值
    }
    
    /*
    引用传递:实参与形参之间双向传递。引用是C++中的概念,因此只能在C++中使用
    忽略实现原理,引用就是变量的一个别名,它没有自己的存储数据的内存位置,其访问的是另一个变量的内存位置,
    对引用变量做出的任何改变,都是对它所引用得变量内存位置中数据的更改。
    使用引用变量作为形参,引用变量就是实参列表中相应变量的别名,对形参的任何改变都将真正更改正在调用它的函数中的变量
    */
    void swap(int &a,int &b)
    {
        int temp;
        temp=a;
        a=b;
        b=temp;
    }
    
    int main(int args,char **argv,char *envp[])
    {
        int m,n;
        cout<<"please input m and n:"<<endl;
        //cin>>"m=">>m>>','>>"n=">>n;
        cin>>m>>n;
        cout<<"----begore swap-------"<<endl;
        cout<<"m="<<m<<','<<"n="<<n<<endl;
        cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
        cout<<"----after goodswap--------"<<endl;
        goodswap(&m,&n); //传递给函数形参的是变量m和n的地址
        cout<<"m="<<m<<','<<"n="<<n<<endl;
        cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
        cout<<endl;
    
        cout<<"----begore swap-------"<<endl;
        cout<<"m="<<m<<','<<"n="<<n<<endl;
        cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
        cout<<"----after errorswap--------"<<endl;
        errorswap(m,n);
        cout<<"m="<<m<<','<<"n="<<n<<endl;
        cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
        cout<<endl;
    
        cout<<"----begore swap-------"<<endl;
        cout<<"m="<<m<<','<<"n="<<n<<endl;
        cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
        cout<<"----after swap--------"<<endl;
        swap(m,n);
        cout<<"m="<<m<<','<<"n="<<n<<endl;
        cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
        cout<<endl;
    
        cout<<"----begore swap-------"<<endl;
        cout<<"m="<<m<<','<<"n="<<n<<endl;
        cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
        cout<<"----after fakeswap--------"<<endl;
        m,n=fakeswap(m,n);
        cout<<"m="<<m<<','<<"n="<<n<<endl;
        cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
    }
    

    结果:


    image.png

    欢迎指正!

    相关文章

      网友评论

        本文标题:C/C++参数传递方式总结

        本文链接:https://www.haomeiwen.com/subject/jgrdnctx.html