引用可以看作一个常量指针,如: int a=10; int &b=a; const int *c=&a 上面两句的含义差不多。 对于简单应用,从低层的实现来看是一样的: int a=10; int *b=&a 生成这样的代码 mov [ebp],10 lea eax,[ebp] mov [ebp-10],eax 引用: int a=10; int &b=a; 生成同样的代码 mov [ebp],10 lea eax,[ebp] mov [ebp-10],eax 但是在进行参数传递时就出现了不一样。 下面拷贝了关于函数传递指针和引用的讨论中一段内容,实兆咐在懒得写了,楼主凑合看吧。 参数传递指针时将直接对指针指向的地址进行操作 传递指针的引用时,通过间接寻址,来实现对〔侍首指针指向的地址〕进行操作。老猜数 看看下面一段程序反汇编后的内容就很清楚了 #include using namespace std; void f1(int *&a) { int *b; b=a; } void f2(int *a) { int *b; b=a; } void main() { int m=10; int *n=&m f1(n); f2(n); } //--------------------------------------------------------------------------- * Referenced by a CALL at Address: |:00401187 | :00401150 55 push ebp :00401151 8BEC mov ebp, esp :00401153 51 push ecx //[ebp+08]即为压栈内容:n的有效地址 :00401154 8B4508 mov eax, dword ptr [ebp+08] //取得主函数中m的有效地址--》edx :00401157 8B10 mov edx, dword ptr [eax] //b=a; :00401159 8955FC mov dword ptr [ebp-04], edx :0040115C 59 pop ecx :0040115D 5D pop ebp :0040115E C3 ret * Referenced by a CALL at Address: |:00401190 | :00401160 55 push ebp :00401161 8BEC mov ebp, esp :00401163 51 push ecx //取得压栈内容:n的有效内容(即m的有效地址) :00401164 8B4508 mov eax, dword ptr [ebp+08] //b=a; :00401167 8945FC mov dword ptr [ebp-04], eax :0040116A 59 pop ecx :0040116B 5D pop ebp :0040116C C3 ret --------------->函数开始<---------------------------- :00401170 55 push ebp :00401171 8BEC mov ebp, esp :00401173 83C4F8 add esp, FFFFFFF8 int m=10; :00401176 C745FC0A000000 mov [ebp-04], 0000000A int *n=&m :0040117D 8D45FC lea eax, dword ptr [ebp-04] :00401180 8945F8 mov dword ptr [ebp-08], eax f1(n); //由于形参是引用变量,所以将n的有效地址压栈 :00401183 8D55F8 lea edx, dword ptr [ebp-08] :00401186 52 push edx :00401187 E8C4FFFFFF call 00401150 :0040118C 59 pop ecx f2(n); //由于形参是指针变量,所以将n的有效内容压栈(即m的有效地址) :0040118D FF75F8 push [ebp-08] :00401190 E8CBFFFFFF call 00401160 :00401195 59 pop ecx :00401196 59 pop ecx :00401197 59 pop ecx :00401198 5D pop ebp :00401199 C3 ret
版权声明:文章由 百问九 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.baiwen9.com/article/137866.html