Reference - ShenYj/ShenYj.github.io GitHub Wiki

Reference

简介

在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值
在C++中,使用引用(Reference)可以起到跟指针类似的功能

  • 示例

    int age = 10;
    
    // 指针 *p就是age的别名
    int *p = &age;
    *p = 30;
    
    // 引用 ref就是age的别名
    int &ref = age;
    ref = 30;
    /// 数组引用, 参考补充中的 数组指针
    int array[] = { 1, 2, 3 };
    int (&ref)[3] = array
    /// 指针引用 ; 等于指针的别名
    int age = 10;
    int *p = &age;
    int *&ref = p;
    
    *ref = 30;
    int height = 30;
    ref = &height;

注意点

  • 引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
  • 对引用做计算,就是对引用所指向的变量做计算
  • 在定义的时候就必须初始化,一旦指向了某个变量,就不可以在改变,“从一而终”
  • 可以利用引用初始化另一个引用,相当于某个变量的多个别名
  • 不存在【引用的引用、指向引用的指针、引用数组】

引用存在的价值之一: 比指针更安全、函数返回值可以被赋值

本质

引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针

一个引用占用一个指针的大小

指针补充

  • int *arr[3]

    指针数组,可以存放3个指针元素的数组

  • int (*arr)[3]

    数组指针,用于指向数组的指针, 数组放三个int类型元素

常引用

引用可以被 const 修饰, 这样就无法通过引用修改数据了,可以成为常引用

int age = 10;
const int &ref = age;

/// 编译错误
ref = 30;
int age = 10;
/// 引用的特性, 写不写效果一样
int & const ref = age;

/// 不会报错, 参考 指针常量 (能够赋值,不能改变指向)
ref = 30;

参考 const 修饰指针时的使用场景

总结:

  • const 必须写在 & 符号的左边,才能算是常引用

  • const 引用的缺点

    • 可以指向临时数据(常量、表达式、函数返回值等)

      /// 报错
      int &ref = 30;
      /// 正常
      const int &ref = 30;
      /// 表达式
      int a = 1;
      int b = 2;
      const int &ref = a + b;
      int func() {
        return 10;
      }
      
      /// 函数返回值
      int const &ref = func();
    • 可以指向不同类型的数据

      int age = 10;
      const double &ref = age;
    • 作为函数参数时 (此规则也适用于 const 指针)

      • 可以接受const和非const实参(非const引用,只能接受非const实参)

        引用类型作为参数时默认只能传变量, 不支持常亮值的传递, 通过 const 修饰形参类型, 使函数支持传递变量(e.g.: a)和常量值(e.g.: 10)

      • 可以跟非const引用构成重载

        无法与非引用函数构成重载,编译会报错

      • 当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量

        int age = 10;
        const long &ref = age;
        age = 30;
        
        /// 输出的值是 10
        /// 通过汇编代码, 先将10复制给寄存器,然后将寄存器的值存在另外一段栈空间(临时变量), 重新给age赋值改变的是age所在栈空间的内容
        cout << ref << endl;

        如果相同类型,不会产生临时变量

⚠️ **GitHub.com Fallback** ⚠️