前言
指针和引用在形式上很好区别,在C++中相比于指针我们更喜欢使用引用,但是它们的使用场景又极其类似,它们都能直接引用对象,对对象进行处理,那么究竟为什么会引入?什么时候使用指针?什么时候使用引用?这两者实在容易混淆,在此我详细介绍一下指针和引用。
指针和引用的定义
维基百科中这样解释
指针:
在计算机科学中,指针(英语:Pointer),是编程语言中的一类数据类型及其对象或变量,用来表示或存储一个存储器地址,这个地址的值直接指向(points to)存在该地址的对象的值。
引用:
在C++编程语言中,引用是一种简单的引用数据类型,其功能不如从C继承的指针类型,但更安全。C++引用的称可能会引起混淆,因为在计算机科学中,引用是一种通用的概念数据类型,指针和C++引用是特定的引用数据类型实现。
但说了和没说差不多。下面用通俗易懂的话来给概述一下。
- 指针
对于一个类型T,T*
就是指向T的指针类型,也就是说T*
类型的变量能够保存一个T类型变量的地址。
int main()
{
int i = 1;
int* p = &i;
cout << "p = " << p << endl;
cout << "i = " << i << endl;
return 0;
}
关系如图:
- 引用
引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。见下图,所示引用的含义:
指针和引用的区别
首先,引用不可以为空,但指针可以为空。前面也说过了引用是对象的别名,那么能初始化引用的前提一定是被引用的对象存在,引用为空——对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化。因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针;如果变量总是指向一个对象,并且这个变量一定不为空,这时你应该使用引用。如果定义一个引用变量,不初始化的话连编译都通不过(编译时错误):
int main()
{
int i = 10;
int* p;
int& r;
return 0;
}
报错:
“r”: 必须初始化引用
而声明指针并不需要初始化操作,即它可以不指向任何对象,也正因如此,