C++ 中的引用

#include <iostream>
using namespace std;

void Swap(char* & rp, char* & rq)
{
    char *t = rp;
    rp = rq;
    rq = t;
}

void Swap(int& rp, int& rq)
{
    int t = rp;
    rp = rq;
    rq = t;
}

void Swap(int* rp, int* rq)
{
    int t = *rp;
    *rp = *rq;
    *rq = t;
}
int foo()
{
    int a = 100;
    return a;
}

int main()
{
    int a1, b1;
//    int &ra;        //引用在声明时就必须初始化,一经初始化,不可更改
    int &ra1 = a1;   //在编译阶段确定关系
    ra1 = b1;       //引用在声明时初始化后,不可更改,此处不是将ra1变为b1的引用,此处是将b1的值赋值给ra1,此时a1的值也随之改变了
//    float &rb1 = b1;//引用需与原类型保持一致
    cout<<"a1 address: "<<&a1<<endl;
    cout<<"ra1 address: "<<&ra1<<endl;

    int &rra1 = a1;   //可以给原类型再次声明一个别名,即一个变量可以声明多个别名
    int &rrb1 = ra1;  //也可对原类型别名再次声明一个别名,还是原类型的别名,即一个变量可以有很多个别名
    /*-------------------------------------------------------------*/
    int * p1;
    int * & rp1 = p1;    //声明一个指针的引用,也就是说这个rp1就是p1的别名
    int ** pprp1 = &rp1;  //一个指向引用的地址的指针
//    int &* prp1 = &rp1;  //引用的指针不存在的,不能定义一个指向引用的指针
    /*-------------------------------------------------------------*/
    int *p2;
    int * * pp2= &p2;
    int a2;
    int & rx2 = a2;
//    int && rrz2 = rx2;   //引用的引用,不存在的,在C++11之后是引用的引用
    /*-------------------------------------------------------------*/
    int a3, b3, c3;
    int * pArr3[] = {&a3, &b3, &c3};  //定义一个指针数组
//    int & rArr3[] = {a3, b3, c3};     //定义一个引用数组,不能建立一个引用的数组,不合法的。其rArr3本质是int & *,不存在的

    int array3[5] = {100, 200, 300, 400, 500};
//    int * & r3 = array3;
//    int * & pr3 = array3;
    int * const & ppr3 = array3;
    cout<<"sizeof(ppr3) = "<<sizeof(ppr3)<<endl;
    /*-------------------------------------------------------------*/
    int * AppendixpArr3[] = {&a3, &b3, &c3};  //定义一个指针数组
    int (*ppArr3)[5] = &array3;  //定义一个数组指针
    cout<<"*ppArr3 = "<<*ppArr3<<endl;
    cout<<"**ppArr3 = "<<**ppArr3<<endl;
    cout<<"*(ppArr3 + 1) = "<<*(ppArr3 + 1)<<endl;
    cout<<"(*ppArr3 +1) = "<<(*ppArr3 + 1)<<endl;
    cout<<"*(*ppArr3 +1) = "<<*(*ppArr3 + 1)<<endl;

    int (&ra3)[5] = array3;    //定义一个数组的引用
    cout<<"sizeof(ra3) = "<<sizeof(ra3)<<endl;
    /*----------------- --------------------------------------------*/
    const int val4 = 10; //const定义时必须初始化
//    int & rv4 = val4;
    const int & rrv4 = val4;

    int data4;
    int &rd4 = data4;
    const int &rrd4 = data4;

//    int & c5 = 55;    //引用是为已有变量取一个别名
    const int & cc5 = 55;

    int a5 = 3;
    int b5 = 5;
//    int &rret5 = a5 + b5;
    const int &rrret5 = 3 + 5;
    const int &rrrret5 = a5 + b5;
    /*-------------------------------------------------------------*/
//    int& ra6 = foo();
    const int& rra6 = foo();
    cout<<"ra6 = " << rra6 << endl;
    /*-------------------------------------------------------------*/
    double d7 = 100.12;
//    int &rd7 = d7;
    const int &rrd7 = d7;

    int a7 = 10;
    const int &ra7 = a7;
    int const &rb7 = a7;
//    ra7 = 100;
//    rb7 = 200;
//    int & const rc7 = a7; //'const' qualifiers cannot be applied to 'int&'
    /*-------------------------------------------------------------*/
    int a =10; int b = 20;
    Swap(&a, &b);
    Swap(a, b);
    return 0;
}

/* 引用的本质int & ~ int * const; const引用:const int & ~ const int * const
 * 1 变量名本身就是一段内存的引用,即变量名是一段内存的别名。编译过后,在内存中a是不存在的
 * 1 引用是一种关系型声明,而非定义。不能独立存在,必须初始化且与原类型保持一致,且不分配内存。
 * 2 声明关系,一经不可变更。
 * 3 可对引用再次引用,多次引用的结果是某一个变量具有多个别名,多个别名间是平等关系。
 * 4 辨别引用与其它,&符号前有数据类型时,是引用其它皆为取地址或按位与。
*/

struct TypeP
{
    char *p;
};
struct TypeC
{
    char c;
};
struct TypeR
{
    char& r; //把引用单列出来,不与具体的对象发生关系
};
int size()
{
    printf("%d %d %d\n", sizeof(TypeP),sizeof(TypeC),sizeof(TypeR));
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值