为什么要引入“引用”?
- C++中指针十分不安全,使用不恰当就会使程序出错。所以提出"引用"来替代指针,提高程序的安全性。
- 它使原来在C语言中只能使用指针来实现的功能,有了另一种实现的方式。而且在书面书写更为简洁。
引用的定义
- 引用就是给变量起别名,他不能脱离被引用的对象而独立存在。
- 引用的声明方法:类型标识符 &引用名=目标变量名(如:
int &ptr = num;
)
引用和指针的相同点
- 他们在内存中都是占用4字节(32位系统)的内存空间。
- 他们存放的都是被引用对象的地址。
引用和指针的区别
-
网上有些说法是,引用自身不是一个变量,编译器可以不给引用分配空间。实际上引用本身也是一个变量,只是这个变量比较特殊,和指针一样存放的是被引用对象的地址,只是这个变量一旦指向后就不能改变。实际上在底层,引用是由指针按照指针常量的方式来实现的。
-
引用在定义的时候,必须进行初始化
(不可定义一个引用指向NULL,必须指向对应的变量)
,并且不能够改变;指针在定义的时候不一定需要初始化,并且指向的空间可变。 -
指针本身允许寻址(即&p返回的是指针常量/变量本身的地址)被引用对象使用*p来表示;引用本身不允许寻址,&r返回的是被引用对象的地址,而不是引用本身的地址,被引用的对象,直接用引用本身表示。
-
凡是使用引用的代码,都可以转化为使用指针常量的形式;但是使用指针常量的代码,却不一定能够使用引用来表示。如
int i = 5, j = 6; /* 合法代码 */ int* const array[] = {&i, &j}; /* 非法代码 */ int& const array[] = {i, j};
数据元素允许是指针常量,但是不允许是引用。
-
可以定义多级指针,但是没有多级引用,只能定义一级引用。
-
指针和引用的自增加运算结果是不一样的,指针自增加指向的是下一个地址空间,引用的自增加则是对应变量的值自增加。
-
sizeof()
引用,得到的是所指向的变量(对象)的大小,而sizeof()
指针,得到的是指针本身的大小。 -
引用访问一个变量是直接访问,而指针访问一个变量是间接访问。