引用的知识大概分四块:引用基础、引用当左值、指针的引用、const(常量)的引用
1、引用(普通引用)
⑴引用概念
⑵引用是C++的概念
⑶引用做函数参数
普通引用在声明时必须用其他的变量进行初始化
引用作为函数参数时不进行初始化
①复杂数据类型 的引用
    #include <iostream>
    using namespace std;
    struct Teacher
    {
        char name[64];
        int age;
    }
    
    void printfT(Teacher *pT)
    {
       cout << pT->age << endl;  //指针应用
       
    }
    
    void printfT2(Teacher &pT)
    {
       cout << pT.age << endl;  // 引用
       pT.age = 33;   //pT是t1的别名,相当于修改了t1;
    }
    
    void printfT3(Teacher pT)
    {
       cout << pT.age << endl;// pT是形参
       pT.age = 45;   //只会修改pT变量,不会修改t1变量
    }
    
    void main()
    {
        Teacher t1;
        t1.age = 35;
        printfT(&t1);
        printfT2(t1);   //pT是t1的别名
        printfT3(t1);   //pT是形参,t1 拷贝一份数据给pT
        
        printf("t1.age:%d \n",t1.age); //输出依然为35
        
        cout << "hello..." << endl;
    }⑷引用的意义
⑸引用的本质思考
两点来思考:1、C++编译器背后做了什么工作?
2、普通引用有自己的空间吗?答案是 有的
引用的本质:引用是一个有地址,引用是常量。。。
char* const p;
⑹引用的本质
⑺引用结论
⑻函数返回值是引用(引用当左值)
C++引用使用时的难点:
当函数返回值为引用时,
1、 若返回栈变量
不能成为其他引用的初始值
不能作为左值使用
#include <iostream>
int getAA1()
{
    int a;
    a = 10;
    return a;
}
//返回a的本身;要看用什么类型来 接收返回的值
int& getAA2()
{
    int a; //
    a = 10;
    return a;
}
int* getAA3()
{
    int a;
    a = 10;
    return &a;
}
void main()
{
    int a1 = getAA1; //输出a1 = 10
    
    int a2 = getAA2();// 输出a2 = 
    
    int &a3 = getAA2();//是错误的;若返回栈变量 不能成为其他引用的初始值
    cout << "hello.." << endl;
}2、 若返回静态变量或全局变量
可以成为其他引用的初始值
即可作为右值使用,也可作为左值使用
int j1()
{
    static int a = 10;
    a++;
    return a;
}
int& j2()
{
    static int a = 10;
    a++;
    return a;
}
void main()
{
    int a1 = 10;
    int a2 = 20;
    
    a1 = j1();
    a2 = j2();
    int &a3 = j2();
    printf("a1:%d\n",a1);
    printf("a2:%d\n",a2);
    printf("a3:%d\n",a3);
}
//函数当左值
//返回变量的值
int g1()
{
   static int a = 10;
    a++;
    return a;
}
//返回变量本身
int& g2()
{
   static int a = 10;
    a++;
    return a;                //即返回变量a
}
void main()
{
    g1() = 100;//相当于  10 = 100;是错误的
    
    g2() = 100;//相当于  a = 100;改变了a的值 ;原因:函数返回值是一个引用,可以当左值
    g2();   //打印a的值,应该是101
    
}C++链式编程中,经常用到引用,运算符重载专题
⑼指针引用
C语言二级指针原理
#include <iostream>
using namespace std;
struct Teacher
{
    char name[64];
    int age;
}
//在被调用函数 获取资源
int getTeacher(Teacher **p)
{
    Teacher **tmp = NULL;
    tmp = (Teacher *)malloc(sizeof(Teacher));
    if(tmp == NULL)
    {
        return -2
    }
    p->age = 33; //p是实参的地址 *实参的地址 去间接的修改实参的值
    
    *p = tmp;
}
//C++中的引用 (指针引用)
int getTeacher2(Teacher * &myp)
{
   //给myp赋值相当于给main函数中的pT1赋值
    myp = (Teacher *)malloc(sizeof(Teacher));
    if(myp == NULL)
    {
       return -1;
    }
    myp->age = 36;
}
void freeTeacher(Teacher *pT1)
{
    if(pT1 == NULL)
    {
        return;
    }
    free(pT1);
}
void main()
{
    Teacher *pT1 = NULL;
    1、//C语言中的二级指针
    getTeacher(&pT1);
    cout << "age" << pT1->age << endl;
    freeTeacher(pT1);
    
    
    2、//C++中的引用(指针的引用)
    
    //引用的本质  间接赋值的后两个条件 让C++编译器帮程序员做了
    getTeacher2(pT1);
    cout << "age" << pT1->age << endl;
    freeTeacher(pT1);
    cout << "hello..." << endl;
}本文出自 “11907685” 博客,请务必保留此出处http://11917685.blog.51cto.com/11907685/1893022
原文:http://11917685.blog.51cto.com/11907685/1893022