指针:

  • 指向值,但本身值为地址。
  • 可以有null pointer,指向特殊地址0
  • 初始化后可以被改变

引用:

  • 相当于const指针,int& r = n等同于int *const r = &n
  • 因为是int *const所以初始化之后,r本身的值不能改变,也就是不能改变它指向的地址了

关于int *const r:

  • 表示一个常量指针,指向一个整数。
  • 指针是常量:一旦初始化,指针本身的值(即它指向的地址)不能改变。
  • 指向的数据是可变的:可以通过这个指针修改它指向的整数的值。
1
2
3
4
5
6
int value1 = 10;
int value2 = 20;
int *const ptr = &value1; // 常量指针,指向 value1,可以将const后面的(ptr)单独看,它是指针本身,所以是指针本身不能变,也就是ptr所储存的地址不能变

*ptr = 15; // 这是可以的,因为可以修改指针指向的数据,所以也可以更改被引用的变量的值
// ptr = &value2; // 报错,因为不能修改指针本身的值

相应的有const int *

  • 表示一个指向常量整数的指针。
  • 指针是可变的:指针本身的值(即它指向的地址)可以改变。
  • 指向的数据是常量:不能通过这个指针修改它指向的整数的值。
1
2
3
4
5
6
int value1 = 10;
int value2 = 20;
const int *ptr = &value1; // 指向常量整数的指针,可以将(int *ptr)看作一个整体,它代表的是指针指向的值,所以是指向的值不能改变

// *ptr = 15; // 报错,因为不能修改指针指向的数据
ptr = &value2; // 这是可以的,因为可以改变指针本身的值

所以,引用的作用就是一个常量指针,它经常被用于函数中传递数据来节省单独copy一次的空间,或者当函数执行的过程中,参数需要永久被改变,就可以通过引用来传递参数(因为它是通过地址来获取值,所以更改引用的值,就是在地址上更改值,而不是更改复制的值)