1.什么是引用
引用是某一对象(变量)的一个别名。
int m=0;
int &n=m;
n=1;
cout<<"n "<<n<<endl;
cout<<"m "<<m<<endl;
&表示n是m的引用,即别名,对n的任何操作就是对m的操作。
所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。
将n的值赋值为1,则m的值也变为1
2.什么是指针
指针用于指向对象(变量),指针存放的是对象(变量)的地址。
int m;
int *n=&m;
指针n是一个指向int型变量m的指针。
&是取地址操作符,&m为m的地址。
3.引用和指针的联系和区别
1)都是有关地址的
引用是对象本身,而指针是对象的地址。
2)都是间接访问对象
3)都能用于函数参数和返回值传递
4)指针是一个实体,引用只是别名
指针会分配内存(4字节int型),引用不会
5)指针可变,引用不可变
指针指向的地址,其指向地址中存放的数据都是可变的
引用必须在一开始就被初始化,而且一旦和一个对象绑定后,就不能再改变(从一而终)。
6)指针可为空,引用不能。
4.函数参数和返回值传递方式
1)值引用
值传递过程中,被调用的形式参数作为被调函数函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
2)指针传递
指针传递本质上是值传递,只不过它传递的是一个地址值。我们可以用*操作符访问实参,从而对实参进行操作。
3)引用传递
引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址(不必通过*操作符),即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量(此时形参就是实参)。
5.从编译角度理解指针和引用
程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应的地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。
6.引用不能const,指针能const,const的指针不可变
7.sizeof引用得到的是所指向的变量的大小,而sizeof指针得到的是指针本身的大小
8.指针和引用的自增(++)运算意义不一样。