• 函数的三种值传递方式


    关于函数参数的传递方式

    传值参数:

    实际参数的值被复制到由函数开辟的内存空间中,成为形参的初始值。完成参数值传递之后,函数体中的语句对形参的访问、修改都是在这个标识对象上操作的,与实际参数无关。

    实例:

    #include<iostream>
    #include<cstring>
    using namespace std;
    void swap(int ,int);
    int main()
    {
        int a, b;
        cin >> a >> b;
        cout << "a=" << a << " b=" << b << endl;
        swap(a, b);              
        cout << "a=" << a << " b=" << b << endl;
        system("pause");
    }
    void swap(int a, int b)             
    {
        int temp = a;           
        a = b;
        b = temp;
        cout << "a=" << a << " b=" << b << endl;
    }
    View Code

    输出结果:

    理解:输入4,5,赋给a,b。调用函数swap,把a,b的值传递给函数中的形参,在swap函数中,输出交换后的形参的值。然后再main函数中输出a,b的值,发现a,b实际上并没有交换值,这是因为swap函数只对形参进行操作。

    指针参数:

    指针传递本质上和值传递差不多,实际上是把实际的指针参数传递给函数中创建的形参指针。不同的地方在于,指针传递的情况时,可以通过再函数中通过形参指针的间址访问对实际变量做出更改,这是值传递无法做到的。

    代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    void swap(int *, int *);
    int main()
    {
        int a, b;
        cin >> a >> b;
        cout << "a=" << a << " b=" << b << endl;
        swap(&a, &b);              //把a,b的地址传递给swap函数
        cout << "a=" << a << " b=" << b << endl;
        system("pause");
    }
    void swap(int *p, int *q)
    {
        int temp = *p;            //通过指针简直访问,交换a,b的值
        *p = *q;
        *q = temp;
    }
    View Code

     引用参数:
    与以上两者不同的是函数调用时,形式参数不需要开辟新的存储空间,形式参数名作为引用(别名)绑定与实际参数表示的对象上。执行函数体时,对形参的操作就是对实参对象操作。

     代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    void swap(int &, int &);
    int main()
    {
        int a, b;
        cin >> a >> b;
        cout << "before swaping: ";
        cout << "a=" << a << " b=" << b << endl;
        swap(a, b);              //实际参数是整形变量名
        cout << "after swaping: ";
        cout << "a=" << a << " b=" << b << endl;
        system("pause");
    }
    void swap(int &p, int &q)    //形式参数是整形引用
    {
        int temp = p;            //通过名访问,交换a,b的值
        p = q;
        q = temp;
    }

    使用const引用参数:

    #include<iostream>
    #include<cstring>
    using namespace std;
    void swap(const int &,const int &);
    int main()
    {
        int a = 2, b = 55;
        cout << a << " " << b << endl;
        swap(a, b);
        cout << a << " " << b;
    }
    void swap(const int &a, const int &b)
    {
        int temp = a;  
        a = b;      //非法操作a所绑定的对象被约束为只读,无法通过别名对该对象进行修改
        b = temp;
    }

    与上述类似,使用const关键字约束对指针变量所指向对象的访问,这种指针称为指向常量指针。
    如:

    int a=2,b=3;

    const int *p1=&a;       //声明一个指向常量的指针并给指针初始化

    const int *p2;

     p2=&b;      //可以通过,因为指向常量的指针只对指针所指向的对象进行约束,并不对指针本身进行约束,所以可以先声明,后赋值

    *p1=3;        //非法,无法通过p1间接对a进行修改

    a=3;         //合法,a是int型变量,可以修改

  • 相关阅读:
    python设计模式-单例模式
    bash脚本条件测试总结
    Python网络编程:IO多路复用
    Python面向对象高级编程:@property--把方法变为属性
    Sql Server存储过程基本语法
    接口幂等性
    [转载]使用消息队列实现分布式事务-公认较为理想的分布式事务解决方案
    C#分布式事务解决方案-TransactionScope
    SOA架构和微服务架构的区别
    Atlas实现数据库读写分离
  • 原文地址:https://www.cnblogs.com/urahyou/p/10018176.html
Copyright © 2020-2023  润新知