0%

指针和引用

一、区别

1.1 定义

(1)指针是一个变量,其值为另一个变量的地址,指向内存的一个存储单元。是一个对象实体

(2)而引用的本质是给变量起别名,允许通过这个别名去直接操纵和修改对象本身的属性。引用跟原来的变量实质上是同一个东西。

1
2
3
4
5
int a = 5;
//指针
int* p = &a;
//引用
int& b = a;
1.2 空指针与无效引用

(1)指针可以为空,表示它不指向任何有效的内存地址。在指针没有被初始化时,它的值通常是未定义的,为了避免错误,可以将其初始化为 nullptrNULL

(2)引用不能为空,它必须在声明时被初始化,并且始终指向某个对象。试图将引用声明为 null 或者空值会导致编译错误。

1.3 初始化

(1)指针需要进行初始化,可以使用取地址符号 & 来获取一个变量的地址,也可以将另一个指针赋值给它。

(2)引用在声明时必须初始化,而且一旦初始化后,不能被重新绑定到其他变量。

  1. 运算符

(1)指针可以通过解引用 * 运算符来访问所指向的对象,也可以使用箭头 -> 运算符来访问成员,例如:p->member

(2)引用则不需要解引用操作符,因为它们在使用时就是被解引用的。例如:b.member

二、指针常量、常量指针、引用

  1. 指针常量:表示这个指针是一个常量,指针的值不可修改。

    int* const p,表示一个指向整数类型的指针常量。

  • int*:表示指向整数类型的指针。这意味着 p 是一个指针,可以存储整数类型变量的地址。
  • const:表示常量,这里用于修饰指针。const 关键字使得指针变量成为一个常量,即指针的值(地址)不能被修改,但是可以通过 p 修改它所指向的整数值。
  1. 常量指针:表示该指针指向的值是一个常量,不可修改。

    const int* p,表示一个指向整数常量的指针。

  • const:表示常量,这里用于修饰整数类型。const 关键字使得指针所指向的整数值为常量,即不能通过 p 修改它所指向的整数值。
  • int*:表示指向整数类型的指针。这意味着 p 是一个指针,可以更改指针的指向,让其指向其他值
1
2
3
4
5
6
7
8
9
10
11
int x = 10;
int y = 20;

int* const p1 = &x; // p 是一个指向整数类型的指针常量,指向 x 的地址
*p1 = 15; // 合法,修改了 p 指向的整数变量 x 的值
// p1 = &y; // 不合法,试图修改 p 的值(地址),但 p 是一个常量,其值不能修改

const int z = 20;
const int* p2 = &x; // p 是一个指向常量整数类型的指针,指向 x 的地址
// *p2 = 15; // 不合法,试图通过 p 修改其所指向的整数值,但整数值是常量,不能修改
p2 = &z; // 合法,修改 p 指向的地址,但是 p 仍然指向一个整数类型的常量
  1. 引用的本质在c++内部实现是一个指针常量. 即可以通过引用修改原变量值,但引用不能更改绑定其他变量。
1
2
3
4
int a = 10;
int& b = a;
//等价于
int* const b = &a;

三、区分下列指针类型

1
int *p[10]

表示指针数组,是一个大小为10的数组,数组元素为int *类型的指针。

1
int (*p)[10]

表示一个数组指针,该指针指向一个大小为10,元素类型为int的数组首地址。

1
int *p(int)

表示一个函数声明,函数返回值类型为int*,函数名为p,传入参数类型为int

1
int (*p)(int)

表示一个函数指针,即p是一个指向函数的指针,该函数接受一个int类型的参数,且返回值为int