首先,鄙人也是正在学习中的学生,不敢说深入彻底的理解了引用的本质。只是略有深度而已,请大家参考,也是督促自己深入理解一下引用。
老话:不喜勿喷哈,如有错误,敬请批评指正。
进入正题:
引用:老师一定都讲过,引用是变量的别名,如:
引用的本质,其实就是一个指针,一个const类型的指针:
我们总是会说的引用是一个别名,不占用内存空间。此话应该说是半对。网上有句经典的话说:你可以拥有引用,但编译器仅仅拥有地址。所以实际上当定义了一个引用同时初始化之后,并没有为变量的这个别名分配空间。所以你在调试的时候会看到这样的画面,你会觉得,引用真的只是一个别名,它和a是一样的。真的没有占内存。
然而对于编译器及编译后而言,它不会再管别名还是变量名,它只认地址。对于经过编译之后生成的代码而言,没有变量名这一说。且看反汇编:
第一句语句的意思是:把0Ah(十六进制表示,即十进制的10)写入以a为地址的内存区域。
第二句语句的意思是:把a作为地址存入eax寄存器中。
第三句语句的意思是:把eax寄存器中的内容写入以p为地址的内存区域。
/*eax中存放的可是一个地址啊。把一个地址放进一块内存空间,这让你想到了什么?对,指针!*/
那么就是说:
引用在底层,实际是将所要引用的变量的地址放进了另一个内存区域中,也就是将变量的地址赋给了一个指针变量。。。这就是引用的实质。
只不过,特别的地方在于,存放变量地址的这个指针变量被const修饰:决定了这个指针是一个常指针。并且并没有为这个别名开辟空间,所以你在内存看到的是两个相同的地址。你就以为引用真的只是别名,真的不开辟空间了。
引用被翻译成了指针(也就是说它在本质上就是一个指针),是一个常量指针,这个指针恒定的指向了一个变量的空间。所以,引用实则也占用内存空间,在32位机上,占用了4个字节。说引用是变量的别名,只是在语言层面上的一种理解方式。