指针和引用的区别
指针
1.在计算机科学中,指针(英语:Pointer),是编程语言中的一类数据类型及其对象或变量,用来表示或存储一个存储器地址,这个地址的值直接指向(points to)存在该地址的对象的值。
引用
1.在计算机科学中,引用(英语:reference)是指一个可以让程序间接访问于电脑存储器或其他存储设备中一特定数据的值,该数据可以为变量或记录。
区别
对于同时支持引用与指针的C/C++,两类数据型的区别有:
- 指针可以重新赋值,而引用在初始化绑定后就不能再绑定到其他对象。
- 指针对象有它自己的内存地址与内存长度,而引用与它指向的对象具有相同的内存地址、内存长度。因此,可以把引用看作是被指向对象的另一个名字。
- 指针可以指向另一指针,因此允许多层的指针间址(indirection);而引用只允许到对象的一层间址,不允许“引用的引用”。
- 指针可以直接赋值为NULL,引用不能。当然,可以费劲办法把引用绑定到内存的NULL上,但这并不实用。
- 指针可以在数组上遍历(iterate),引用不能。
- 指针需要用运算符“*”来解引用(dereference)以访问它所指向的内存的内容;引用需要显式的解引用。指向类/结构的指针访问成员变量/成员函数需要用运算符->而引用使用运算符.来访问成员。
- 指针是一个变量,保存了内存地址;而C/C++标准都没有明说引用是如何实现的。实际上,几乎所有C/C++编译器把引用作为一个隐式的指针来实现。
- 指针可以成为数组的成员类型,即指针数组;但引用不可以作为数组的成员类型,即不存在“引用数组”。
- const引用可以绑定到临时对象;而指针不能(例如,
int *y = 12;
编译出错)。按照C++11语法,const左值引用可以绑定到一切对象,包括const左值对象,非const左值对象,const临时对象,非const临时对象;右值引用当然可以绑定到临时对象。
参考链接