指针和引用区别

指针的实现机制

对于 int& a = x; ,我们称a为引用变量,x为被引用变量。

  1. 引用的内部实现为一个指针变量, 与指针的实现方式类似。
  2. 引用变量内存单元保存的是被指向变量的地址
  1. 引用变量在定义时必须初始化,而且在使用过程中,引用变量保存的内存单元地址值是不能改变的。 这两点是由编译器来决定的。主要的措施主要是编译器将引用变量的相关操作,转化为特定的汇编语句。例如

    • int& a = x; //此句实际上是将x的地址赋值给a。a是引用int型变量,不是int型变量。
    • int* pa = &a; //此句实际上被编译为a所包含的地址赋给pa而已。
  2. 引用也可以进行取地址操作,但是取地址操作返回的不是引用变量所在的内存单元地址,而是被引用变量本身所在的内存单元地址;

  3. 引用的使用,在源代码级相当于普通的变量一样使用,但在函数参数传递引用变量时,内部传递的实际是变量的地址值(这种机制的实现是通过编译器(编译手段)来实现的)

更多的汇编资料在 C++语言中引用机制的实现分析

综上所知:1. 指针也是一个变量,有自己的存储空间,但是存储的是地址。 2. 引用变量是被引用变量的别名,共享空间。
所有的差异都是这个设计哲学和实现机制决定的。

区别

  1. 实现机制
  2. 指针可以有多级,如int **p, 但是引用只能为一级。int &&p; 因为从引用的设计思路上讲,这是无意义的。A == B, B==C,那么A ==C
  3. 指针的值可以为空,但是引用必须被初始化。
  4. 指针指向的值可以被改变。但是引用不会。
  5. sizeof引用得到的是所指向的变量的大小。sizeof指针,得到的是指针的大小,通常为4.
  6. 指针的自增,是指地址前进一个单位,引用是对被引用变量施加自增。
  7. 指针作为参数被传入后,对指针变量本身的更改实质上也只是更改指针的复制值而已。而引用作为参数,更改引用,更改的是被引用变量。