07 引用和指针的关系
引用很容易与指针混淆,它们之间有三个主要的不同:
-
不存在空引用。引用必须连接到一块合法的内存。但是指针可以被指向一个非法的内存空间(野指针)。
引用:
int a = 10; int& b = a;
指针:
int a = 10; int* p = &a; p = (int*)0x114514;
在这里,
p
最开始指向的是变量a
的内存空间。之后我们强制将这个p
指向0x114514
这个内存空间,就出现了野指针,此时操作野指针指向的内存空间是非法操作。 -
一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
引用:
int a = 10; int& b = a;
指针:
int a = 10; int b = 20; int* p = &a; p = &b;
在这里,指针
p
最开始指向的是变量a
的内存空间。后续被修改指向了变量b
的内存空间。 -
引用必须在创建时被初始化。指针可以在任何时间被初始化。
引用:
int a = 10; int& b = a;
指针:
int* p; int a = 20; p = &a;
在这里是先创建了一个
int
类型的指针p
,但是指针这时候没有指向的内存空间。之后我们创建了一个变量a
,再将变量a
的地址赋值给指针p
。
:-)