指针的底层机制

提出问题:
  • 为什么指针要有类型?
C++代码
int gi;
int* p;
int main()
{
    p = &gi;
    *p = 12;
}
汇编
 mov  dword ptr ds:[006A02ECh],6A02E8h
 mov  eax,dword ptr ds:[006A02ECh]  
 mov  dword ptr [eax],0Ch
机器码
C7 05 EC 02 6A 00 E8 02 6A 00
A1 EC 02 6A 00
C7 00 0C 00 00 00
发现问题的答案:
  • 指针的类型信息决定了赋值/读取时写/读多少个字节
结论:
> C语言的指针类型包含两个方面的信息:
1.地址,存放在指针变量中;
2.类型信息,关于读写的长度,没有存储在指针变量中,放在了该指针读写时的mov指令中,不同的读写长度对应的mov指令不同;
提出问题:
  • 为什么类型不同指针变量赋值编译会报错?答:编译器为了帮助程序员避免越界错误,便促产生了编译错误
  • 为什么强制转换后就可以赋值?强制转换到底发生了什么?

C++代码

int i;
int* pI;
short* pS;
char* pC;
int main()
{
    pI = &i;
    pS = (short*)pI;
    pC = (char*)pI;
    *pI = 0x12345678;
    *pS = 0x1234;
    *pC = 0x12;
}

汇编

 mov   dword ptr ds:[00360610h],36060Ch  
 mov   eax,dword ptr ds:[00360610h]  
 mov   dword ptr ds:[00360614h],eax  
 mov   eax,dword ptr ds:[00360610h]  
 mov   dword ptr ds:[00360618h],eax  
 mov   eax,dword ptr ds:[00360610h]  
 mov   dword ptr [eax],12345678h  
 mov   eax,1234h  
 mov   ecx,dword ptr ds:[00360614h]  
 mov   word ptr [ecx],ax  
 mov   eax,dword ptr ds:[00360618h]  
 mov   byte ptr [eax],12h

机器码

C7 05 10 06 36 00 0C 06 36 00
A1 10 06 36 00
A3 14 06 36 00
A1 10 06 36 00
A3 18 06 36 00
A1 10 06 36 00
C7 00 78 56 34 12
B8 34 12 00 00
8B 0D 14 06 36 00
66 89 01
A1 18 06 36 00
C6 00 12

问题的答案:

  • 指针强制转换后的影响不是在转换的时候发生,而是在用转换后的身份访问内存时体现到了指令中

真的掌握了吗?

int* pI;
short sI = 12;
pI = (int*)&sI;
print("%d, %x,",*pI, *pI);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值