1 指针常量的一个实例
#include <iostream> using namespace std; void main() { int j=3; int var=4; int* p = &var; int* const pf = &var; *pf=8; int i = 5; cout<<&j<<endl; cout<<&var<<endl; cout<<&p<<endl; cout<<&pf<<endl; cout<<&i<<endl; system("pause"); } /*输出: 0012FF44 0012FF40 0012FF3C 0012FF38 0012FF34 */
2 上述指针常量写成引用的形式
#include <iostream> using namespace std; void main() { int j=3; int var=4; int* p = &var; int& f = var; f=8; int i = 5; cout<<&j<<endl; cout<<&var<<endl; cout<<&p<<endl; cout<<&f<<endl; cout<<&i<<endl; system("pause"); } /*输出 0012FF44 0012FF40 0012FF3C 0012FF40 0012FF34 */
3 引用的本质是一个指针常量
从以上两个实例可以看出,引用是占用一个指针的内存空间的,但其引用本身的地址被编译器隐藏了,& f是其指向的变量的地址,而f由编译器实现的自动解引用,f自动解引用为其指向的变量的数据值。所以, 引用的本质是一个指针常量,一个由编译器实现了自动解引用的指针常量。
查看上面两个实例对应的汇编代码,发现其完全一致:
凡是使用了引用变量的代码,都可以转换成使用指针常量对应形式的代码,只不过书写形式上要烦琐一些。反过来,由于对引用变量使用方式上的限制,所以使用指针常量实现的功能不一定能够用引用来实现。
函数返回一个引用可以用作左值:
#include <iostream> using namespace std; int& g2(void) { static int a = 10; a++; printf("a:%d \n", a); return a; } int main(void) { g2() = 100; //函数返回值是一个引用,当左值。 g2(); system("pause"); return 0; } /* a:11 a:101 */
也可以写成返回指针的形式,只是写起来繁琐一些:
#include <iostream> using namespace std; int* const g2(void) { static int a = 10; a++; printf("a:%d \n", a); int* const p = &a; return p; } int main(void) { *(g2()) = 100; //函数返回值是一个引用,当左值。 g2(); system("pause"); return 0; } /* a:11 a:101 */
4 引用语法引入的理由或合理性
4.1 常量要求初始化,增强了其安全性;
4.2 实现了自动解引用,使用上更简洁;
-End-