一、区别
1.1 定义
(1)指针是一个变量,其值为另一个变量的地址,指向内存的一个存储单元。是一个对象实体
(2)而引用的本质是给变量起别名,允许通过这个别名去直接操纵和修改对象本身的属性。引用跟原来的变量实质上是同一个东西。
1 | int a = 5; |
1.2 空指针与无效引用
(1)指针可以为空,表示它不指向任何有效的内存地址。在指针没有被初始化时,它的值通常是未定义的,为了避免错误,可以将其初始化为 nullptr
或 NULL
。
(2)引用不能为空,它必须在声明时被初始化,并且始终指向某个对象。试图将引用声明为 null 或者空值会导致编译错误。
1.3 初始化
(1)指针需要进行初始化,可以使用取地址符号 &
来获取一个变量的地址,也可以将另一个指针赋值给它。
(2)引用在声明时必须初始化,而且一旦初始化后,不能被重新绑定到其他变量。
- 运算符
(1)指针可以通过解引用 *
运算符来访问所指向的对象,也可以使用箭头 ->
运算符来访问成员,例如:p->member
。
(2)引用则不需要解引用操作符,因为它们在使用时就是被解引用的。例如:b.member
。
二、指针常量、常量指针、引用
指针常量:表示这个指针是一个常量,指针的值不可修改。
如
int* const p
,表示一个指向整数类型的指针常量。
int*
:表示指向整数类型的指针。这意味着p
是一个指针,可以存储整数类型变量的地址。const
:表示常量,这里用于修饰指针。const
关键字使得指针变量成为一个常量,即指针的值(地址)不能被修改,但是可以通过p
修改它所指向的整数值。
常量指针:表示该指针指向的值是一个常量,不可修改。
如
const int* p
,表示一个指向整数常量的指针。
const
:表示常量,这里用于修饰整数类型。const
关键字使得指针所指向的整数值为常量,即不能通过p
修改它所指向的整数值。int*
:表示指向整数类型的指针。这意味着p
是一个指针,可以更改指针的指向,让其指向其他值。
1 | int x = 10; |
- 引用的本质在c++内部实现是一个指针常量. 即可以通过引用修改原变量值,但引用不能更改绑定其他变量。
1 | int a = 10; |
三、区分下列指针类型
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