这篇博文主要讲讲指针与引用之间的相同点和不同点。对于使用不做介绍(太熟了)
相同点
- 都是地址概念
指针为指向一块内存,它的内容是所指内存的地址。
引用是某块内存的别名,使用相同的地址,相当于一个变量有两个名字。
指针引用之间的转换:
- 指针转引用:把指针用*就可以转换成对象,可以用在引用参数当中。
- 引用转指针:把引用类型的对象用&取地址就获得指针了。
int a = 0;
int *pA = &a;
void fun(int &va){} // 定义
fun(*pA); // 调用
不同点
- 指针是一个实体,而引用仅是个别名 ;
- 指针和引用的自增(++)运算意义不一样,指针是对 内存地址 的自增,引用是对 指针指向的值 的自增量;
- 引用使用时无需解引用(*),指针需要解引用;
- 引用不能为空,指针可以为空;
例如:
int ival = 1024;
int &refVal = ival; //refVal指向ival(是ival的另一个名字)
int &refVal2; //报错:引用必须被初始化
一般在初始化变量时,初始值会被拷贝到新建的对象中
然而定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用
一旦初始化完成,引用将和它的初始值对象一直绑定在一起
- 引用只能在定义时被初始化一次,之后不可变;指针可变,例如:
- “sizeof 引用”得到的是所指向的变量(对象)的大小 (数据类型决定) ,而“sizeof 指针”得到的是指针本身的大小,在32位系统指针变量一般占用4字节内存。
- 引用没有const,指针有const。const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有的,前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)。对于const的详解请移步博文:
- 引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const 指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)。
总结: 指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。