引用的本质是对变量起别名。
    &是取地址符,在局部变量中,数据存在栈区,可以通过引用访问同一块内存。

    1. #include <iostream>
    2. using namespace std;
    3. int main() {
    4. int a = 10;
    5. int& b = a;
    6. cout << "a = " << a << endl << "b = " << b << endl;
    7. b = 20;
    8. cout << "a = " << a << endl << "b = " << b << endl;
    9. return 0;
    10. }

    引用必须初始化,且初始化后不可更改。
    引用可简化一些内存操作。

    1. #include <iostream>
    2. using namespace std;
    3. void swap1(int* a, int* b) {
    4. int t;
    5. t = *a;
    6. *a = *b;
    7. *b = t;
    8. }
    9. void swap2(int& a, int& b) {
    10. int t;
    11. t = a;
    12. a = b;
    13. b = t;
    14. }
    15. int main() {
    16. int a = 10;
    17. int b = 20;
    18. swap1(&a, &b);
    19. swap2(a, b);
    20. return 0;
    21. }
    1. //返回局部变量引用
    2. int& test01() {
    3. int a = 10; //局部变量
    4. return a;
    5. }
    6. //返回静态变量引用
    7. int& test02() {
    8. static int a = 20;
    9. return a;
    10. }
    11. int main() {
    12. //不能返回局部变量的引用
    13. int& ref = test01();
    14. cout << "ref = " << ref << endl;
    15. cout << "ref = " << ref << endl;
    16. //如果函数做左值,那么必须返回引用
    17. int& ref2 = test02();
    18. cout << "ref2 = " << ref2 << endl;
    19. cout << "ref2 = " << ref2 << endl;
    20. test02() = 1000;
    21. cout << "ref2 = " << ref2 << endl;
    22. cout << "ref2 = " << ref2 << endl;
    23. system("pause");
    24. return 0;
    25. }

    引用的本质在c++内部实现是一个指针常量.
    讲解示例:

    1. //发现是引用,转换为 int* const ref = &a;
    2. void func(int& ref){
    3. ref = 100; // ref是引用,转换为*ref = 100
    4. }
    5. int main(){
    6. int a = 10;
    7. //自动转换为 int* const ref = &a; 指针常量是指针指向不可改,也说明为什么引用不可更改
    8. int& ref = a;
    9. ref = 20; //内部发现ref是引用,自动帮我们转换为: *ref = 20;
    10. cout << "a:" << a << endl;
    11. cout << "ref:" << ref << endl;
    12. func(a);
    13. return 0;
    14. }

    结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了
    C++支持运算符重载,我们可以自己创建操作方法。