【C++】指针和引用
指针
指针是编程语言中的一个对象,它的值是一个地址直接指向内存中另一个地方。
引用
引用就是某一变量(对象)的一个别名,对引用的操作与对变量直接操作完全一样。
指针和引用的区别
1.指针是一个实体,而引用仅是个别名;
2.引用必须被初始化且必须从一而终(可将引用看做常量指针),指针都可不必;
3.可以有const指针,但是没有const引用;
4.引用不能为空,指针可以为空;
5.“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
6.指针和引用的自增(++)运算意义不一样; 指针自增指向下一个地址,而引用是对变量本身的值的增加。
7.指针可以有多级,但是引用只能是一级(可以定义引用的引用,int i; int& ir = i; int &irr = ir,但这都是一级),例如int **p是合法的,而 int &&a是右值引用;
指针和引用的相同点
两者都是地址的概念,指针指向一块儿内存,其内容为所指内存的地址;引用是某块儿内存的别名。底层可将引用看做常量指针,即指向的地址必须被初始化且不再发生改变的指针。
注意引用作为返回值
1.不能返回局部变量的引用,主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。
2.返回函数内部new分配的内存的引用,可能有内存泄露的风险。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成内存泄漏。
使用指针和引用的情况对比
1.是考虑到存在不指向任何对象的可能(在这种情况下,能够设置指针为空)
2.需要能够在不同的时刻指向不同的对象(在这种情况下,能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么就应该使用引用。
3.重载某个操作符时,应该使用引用。当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。