指针解引用操作符

下面是程序实现的源代码, 

 

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     double obj = 3.14;
 8     double *pd = &obj;
 9     
10     void *pv = &obj;
11     pv = pd;
12 
13     int a = 5;
14     int *ip = &a;
15     int *pa = 0;
16     pa = ip;
17     *pa = *ip;
18 
19     return 0;
20 }

 

 

下面的代码是在VC++6.0调试时候查看反汇编的显示结果,重点看红颜色的标记代码和相应解释

                                  
1 1:   #include <iostream>                                                    

 22:    #include <cstdio>
 33:    using namespace std;
 44:
 55:    int main()
 66:    {
 70040103055push        ebp
 800401031 8B EC        mov         ebp,esp
 90040103383 EC 5C      sub         esp,5Ch
100040103653push        ebx
110040103756push        esi
120040103857push        edi
1300401039 8D 7D A4          lea         edi,[ebp-5Ch]
140040103C B9 17000000       mov         ecx,17h
1500401041 B8 CC CC CC CC    mov         eax,0CCCCCCCCh
1600401046 F3 AB             rep stos    dword ptr [edi]
177:        double obj = 3.14;
1800401048 C7 45 F8 1F 85 EB 51 mov     dword ptr [ebp-8],51EB851Fh   
190040104F C7 45 FC B8 1E 0940  mov     dword ptr [ebp-4],40091EB8h  

这里自己并不是太明白,为什么浮点数赋值就会有两个指令来实现,猜想可能是计算机对整型和浮点数两种存储方式不同导致的。

 

 

208:        double *pd = &obj;
2100401056 8D 45 F8           lea         eax,[ebp-8]
22004010598945 F4             mov         dword ptr [ebp-0Ch],eax
239:
2410:       void *pv = &obj;
250040105C 8D 4D F8           lea         ecx,[ebp-8]
260040105F89 4D F0            mov         dword ptr [ebp-10h],ecx
2711:       pv = pd;
2800401062 8B 55 F4           mov         edx,dword ptr [ebp-0Ch]
29004010658955 F0             mov         dword ptr [ebp-10h],edx
3012:
3113:       int a = 5;
3200401068 C7 45 EC 05000000   mov         dword ptr [ebp-14h],5   ;对于整型的赋值却是一条指令可以解决     

3314:       int *ip = &a;
340040106F 8D 45 EC           lea         eax,[ebp-14h]
35004010728945 E8             mov         dword ptr [ebp-18h],eax
3615:       int *pa = 0;
3700401075 C7 45 E4 00000000   mov         dword ptr [ebp-1Ch],0  [ebp-1Ch]

指向指针pa,这里应该对局部变量的存取有一定的了解。

3816:       pa = ip;
390040107C 8B 4D E8            mov         ecx,dword ptr [ebp-18h]
400040107F89 4D E4             mov         dword ptr [ebp-1Ch],ecx
4117:       *pa = *ip;
4200401082 8B 55 E4           mov         edx,dword ptr [ebp-1Ch]

4300401085 8B 45 E8           mov         eax,dword ptr [ebp-18h]

4400401088 8B 08              mov         ecx,dword ptr [eax]

450040108A890A                 mov         dword ptr [edx],ecx

这里就是重点了。对于指针的解引用操作符,实现过程是先将ip所指的地址存储到一个寄存器中(eax),对指针pa的操作 ;也是如此。然后再对[eax]中的内容进行复制到ecx寄存器中,然后再将ecx的内容传送给[edx]寄存器中,即把指针ip所指的对象的值赋值给*pa

4618:
4719:       return 0;
480040108C33 C0                xor         eax,eax
4920:   }
500040108E 5F                   pop         edi
510040108F 5E                   pop         esi
5200401090 5B                   pop         ebx
5300401091 8B E5                mov         esp,ebp
5400401093 5D                   pop         ebp
5500401094 C3                   ret

 


 

转载于:https://www.cnblogs.com/StudyRush/archive/2011/02/26/1965557.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值