指针和引用的区别

179 阅读3分钟
  • 指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名
  • 指针可以有多级,引用只有一级
  • 指针可以为空,引用不能为NULL且在定义时必须初始化
  • 指针在初始化后可以改变指向,而引用在初始化之后不可再改变
  • sizeof指针得到的是本指针的大小,sizeof引用得到的是引用所指向变量的大小
  • 当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参,两者指向的地址相同,但不是同一个变量,在函数中改变这个变量的指向不影响实参,而引用却可以。
  • 引用本质是一个指针,同样会占4字节内存;指针是具体变量,需要占用存储空间(,具体情况还要具体分析)。
  • 引用在声明时必须初始化为另一变量,一旦出现必须为typename refname &varname形式;指针声明和定义可以分开,可以先只声明指针变量而不初始化,等用到时再指向具体变量。
  • 引用一旦初始化之后就不可以再改变(变量可以被引用为多次,但引用只能作为一个变量引用);指针变量可以重新指向别的变量。
  • 不存在指向空值的引用,必须有具体实体;但是存在指向空值的指针。

指针(Pointer)和引用(Reference)是 C++ 中两种常用的变量间间接访问的机制,它们有以下区别:

  1. 定义和初始化:

    • 指针:指针是一个变量,可以存储另一个对象的内存地址。通过使用 * 运算符来声明指针类型,例如 int* ptr
    • 引用:引用是一个别名,用来直接代表另一个变量。通过在变量前添加 & 符号来声明引用,例如 int& ref = var(其中 var 是一个已存在的变量)。
  2. 空值(NULL/nullptr):

    • 指针:指针可以具有空值,即指向一个无效的内存地址,可以通过将指针设置为 nullptr 或 NULL(在旧的 C++ 版本中)来表示空指针。
    • 引用:引用必须在声明时初始化,并且不能指向空值。
  3. 内存操作:

    • 指针:指针可以被重新赋值指向不同的内存地址,可以对指针进行算术运算(如指针加减),可以通过解引用操作符 * 来访问指针指向的内存中的值。
    • 引用:引用一旦初始化后,不能再改变它所绑定的对象。引用操作符 & 用于获取变量的地址。
  4. 是否需要初始化:

    • 指针:指针可以不进行初始化,未初始化的指针可能具有未知的值。
    • 引用:引用必须在声明时进行初始化,引用始终指向某个已存在的变量。
  5. 空间占用:

    • 指针:指针本身占用内存空间,在 32 位系统中通常占用 4 字节,在 64 位系统中通常占用 8 字节。
    • 引用:引用本身不占用额外的内存空间,它只是变量的别名。
  6. 可空性:

    • 指针:指针可以具有空值,可以用于表示空对象或非法情况。
    • 引用:引用必须总是引用有效的对象,无法表示空或非法情况。

总结:
指针和引用都是 C++ 中用于间接访问变量的机制。指针是一个变量,存储另一个对象的内存地址,可以改变指向的对象,可以为空,且需要进行初始化。引用是一个别名,用于直接代表另一个变量,对于绑定的对象不可改变,不可为空,必须在声明时进行初始化。选择使用指针还是引用取决于具体的使用场景和需求。