函数的三种值传递方式

关于函数参数的传递方式

传值参数:

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

实例:

#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型变量,可以修改

原文地址:https://www.cnblogs.com/urahyou/p/10018176.html