关于引用的问题,不是入门问题,求教!
时间:2008-05-12 13:48:32
来源:论坛整理 作者: 编辑:chinaitzhe
函数定义: int A(int & b){b=2-1;/*cout < <b < <endl;*/return 1;}.
调用: main()
{
int b=0;
A(b);
}
这样的情况,在debug调试时,发现在变量察看窗口和表达式察看窗口中,函数A中b的值一直显示初始化值0 。但假如
A中用cout显示来显示的话,b是实际值。返回到main的栈空间中后调试窗口中b值显示正常。
我本来认为,变量察看窗口等,察看,显示的是一个函数的栈内部的变量,但引用的变量,分配的空间应仍在定义出 ,即main中,所以不能产看 。但 想想 ,传入指针不也是一样吗?为什么能正常显示?
希高手解小弟之惑。并深入谈谈引用,比如函数是如A是如何找到A的等等。
网友回复:b= 2-1;
该语句执行完,b的值就会被修改成1
函数是如A是如何找到A的等等
--
没看明白
网友回复:不要过于相信debug的watch功能。一切以打印得到的为准。
网友回复:用不是入门问题来吓我们啊?
明显是你看错了,或者没搞清楚观察的时机
我在VC6下调试时,看到运行到A()中的赋值语句时b已经是1了.
反汇编窗口中代码如下:
- Assembly code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ 6: int A(int& b) 7: { 00401560 push ebp 00401561 mov ebp,esp 00401563 sub esp,40h 00401566 push ebx 00401567 push esi 00401568 push edi 00401569 lea edi,[ebp-40h] 0040156C mov ecx,10h 00401571 mov eax,0CCCCCCCCh 00401576 rep stos dword ptr [edi] 8: b=2-1; 00401578 mov eax,dword ptr [ebp 8] 0040157B mov dword ptr [eax],1 9: cout <<b ; 00401581 mov ecx,dword ptr [ebp 8] 00401584 mov edx,dword ptr [ecx] 00401586 push edx 00401587 mov ecx,offset std::cout (0047be90) 0040158C call @ILT 250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff) 10: cout <<endl; 00401591 push offset @ILT 195(std::endl) (004010c8) 00401596 mov ecx,offset std::cout (0047be90) 0040159B call @ILT 475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0) 11: return 1; 004015A0 mov eax,1 12: }\ 14: void main() 15: { 004015D0 push ebp 004015D1 mov ebp,esp 004015D3 sub esp,44h 004015D6 push ebx 004015D7 push esi 004015D8 push edi 004015D9 lea edi,[ebp-44h] 004015DC mov ecx,11h 004015E1 mov eax,0CCCCCCCCh 004015E6 rep stos dword ptr [edi] 16: int b=0; 004015E8 mov dword ptr [ebp-4],0 17: A(b); 004015EF lea eax,[ebp-4] 004015F2 push eax 004015F3 call @ILT 495(A) (004011f4) 004015F8 add esp,4 18: }
==================================
注重到main()中:
16: int b=0;
004015E8 mov dword ptr [ebp-4],0
这说明b的地址是ebp-4, b被初始化为0.
=======================================
调用A(b):
17: A(b);
004015EF lea eax,[ebp-4]
004015F2 push eax
004015F3 call @ILT 495(A) (004011f4)
004015F8 add esp,4
lea eax,[ebp-4] 就是将b的地址放到eax中.
push eax 就是将b的地址当参数,这也说明引用参数实际上就是个地址
call @ILT 495(A) (004011f4) 调用函数A()
===================================================
A()中:
8: b=2-1;
00401578 mov eax,dword ptr [ebp 8]
0040157B mov dword ptr [eax],1
mov eax,dword ptr [ebp 8]
ebp 8里面的就是b的地址,这句把b的地址放到eax
mov dword ptr [eax],1
这句把1放到eax里面的地址指向的内存中,也就是放到b中
>>>>>
很明显,执行了mov dword ptr [eax],1 后,b就变成了1.
你观察一直是0肯定是自己搞错了什么.
关键字:引用,问题,入门,问题,求教,
上一篇:show一下结贴专用正则
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面