2 引用

本质:给变量起别名

 

 

 

必须初始化,初始化完不可以改变。

 

 

优点:简化指针修改实参!非常有用,降低了指针的难度

#include<iostream>
using namespace std;

// 1.值传递
void mySwap01(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
}

// 2.地址传递
void mySwap02(int* a, int* b) // 指针接收地址
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 3.引用传递
void mySwap03(int& a, int& b) // 本质:别名
{
    int temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a = 10;
    int b = 20;
    mySwap01(a, b); // 值传递,形参不会修饰实参
    mySwap02(&a, &b); // 地址传递,形参会修饰实参
    mySwap03(a, b); // 引用传递,形参也会修饰实参

    return 0;
}

 

 

#include<iostream>
using namespace std;

// 引用做函数的返回值
// 不要返回局部变量的引用
int& test01() // 引用方式返回
{
    int a = 10; //  局部变量存放在栈区
    return a;
}

// 函数的调用可以作为左值
int& test02()
{
    static int a = 10; // 静态变量,存放在全局区,数据在程序结束后系统释放
    return a;
}

int main()
{    
    //int& ref = test01();
    //cout << "ref = " << ref << endl; // 第一次打印是正确的,因为编译器做了保留
    //cout << "ref = " << ref << endl; // 第二次结果是错误的,因为a的内存已经释放
    int& ref2 = test02(); // 本身就是a的别名
    cout << "ref2 = " << ref2 << endl; // 因为是静态变量
    cout << "ref2 = " << ref2 << endl;

    test02() = 1000; // 因为函数调用返回的是一个引用,这个函数调用可以作为左值   a = 1000

    cout << "ref2 = " << ref2 << endl;
    cout << "ref2 = " << ref2 << endl;

    return 0;
}

 

指针常量:指针指向不能改变

引用的本质就是一个指针常量!

这也就是为什么一旦初始化不可以发生改变的原因。

 

posted @ 2021-01-15 15:06  不妨不妨,来日方长  阅读(81)  评论(0编辑  收藏  举报