打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C++引用类型黑技术

      C/C++语言以它的目标程序质量接近汇编代码而受到专业程序员的喜爱。真编译、本地代码、高质量、高效率,代码运行速度极快。语法简洁,使用灵活,的确是一种优秀的编程语言。

     一、为什么引入引用类型

      C/C++的另一特点是完备的指针类型,指针(Pointer)的本质其实就是单元的地址,若当初翻译成接地气的“地址类型”更合适。指针可以灵活操纵各种类型,但一些人滥用指针而钻起了牛角尖。C语言的函数只有传值调用,没有传址参数,用指针可以间接实现,但不直观、方便或带来错误,所以,C++引入“引用”类型(Reference),以解决C语言只有传值调用的缺陷。“引用“类型只是指针类型的补充,两者内部有相似的地方, 有时引用可以简化指针的使用。

   二、什么是引用类型

      "引用“类型的本质就是用指向的地址表示这个指向单元,单元中存放的是另一变量的地址,访问引用变量就是访问它的指向单元。相当于汇编的间接寻址:[地址],或指针类型的“*指针”操作。应用类型与指针类型的区别是,“指针”只表示地址,而“应用”表示地址所对应的单元,相当于指针前面加上了“*”操作符。但C++的引用类型在静态使用时,没有指针方便,令许多人感到“不太满意”。

      引用定义时,必须初始化且只能一次,不能改变指向,你没法访问到它自已的地址。int x=5;  int &p=x;   变量p指向x无法改变。p相当于x的别名,正常无法改变这种关系。 所有对p的操作都将作用于x, 如访问&p将访问的是&x, 所以,有人错误地以为p没有分配单元。 其实这应用单元p是存在的,你用c++正常无法访问它而已,你可以用黑办法访问到,可以任意改变p的指向。

三、黑办法可以改变引用的指向

      引用象指针类型一样也被分配到单元,可以用两种间接办法访问到,一是用邻居的地址相对地推算它的地址,稍有点不靠谱,但可以试试,试得很成功。这与编译器有关,我用C++Builder6.0,局部变量在栈中分配,可以据相邻的y地址推算或x地址推算出p的地址:  本例中是 (int *)(&y)[1] 或 (int *)(&x)[-1]  。

int x=5; int &p=x; int y=6;   // p指向x, p为值5

(int *)(&y)[1]=&y;                //    黑办法将p指向了y,显示p就可看到值已变成6

      这验证了我们上面的判断, 这种办法的实现与编译器有关。C++Builder6.0还可以嵌入汇编指令,这样我们就可以合法访问到p。关键就看你其它版本的c++编译器能不能让你嵌入汇编了。下面两行可以任意改变p的指向: 

      int  x=7;  int  y=123;

      int &p=x;     

      在汇编中直接将y的地址送入p中, p则改指向了y :

      asm       lea  eax, y   ;

      asm       mov  p, eax  ;

       这个例子说明在嵌入汇编中引用p的符号仍是真正地址,而不是所指向的地址。

      结论是C++对引用类型同样分配单元,只是编译器屏蔽了你对它的直接访问。若需要,编译器也可留点后门允许你访问引用原址。 

      我们这样探讨纯粹是为了钻牛角尖,其实静态引用没有太大的需要,你完全可以用指针取代静态引用。当然,“引用”类型在左值、强制类型赋值等方面可以简化指针的使用。

四、为何静态引用出现“限制”

       如果要问为什么C++不能访问应用单元自已? 这要涉及它增加“应用类型"的目的:是为了函数的传址调用, 而不是为了让你对引用静态使用、发挥。传址调用时,实参的地址送入栈中的形参单元,子程序内是通过对形参的访问透明地转而去访问实参,而不许访问栈中的形参(实参的地址)。编译器故意屏蔽保护了引用单元本身。阻止了对应用单元(形参)本身的访问,不是疏忽,而是精心设计,防止子程序内代码无意中损坏形参中的地址,这样才能不出现副作用,这就是引用类型受到访问限制的原因。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
3、C++中函数返回引用
第一部分 基础语言之六函数
C++多态的实现方式总结
总结:c语言中指针的学习
深入理解C语言指针的奥秘(3)
彻底粉碎“指针与数组的困惑”(上)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服