关于指针的强制类型转换问题

xgqxgqxx 2014-03-21 09:22:25
强制类型转换的一个效果是改变指针运算的伸缩
请问C是怎么实现这种功能的呢???
...全文
125 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
PDD123 2014-03-22
  • 打赏
  • 举报
回复

	char * lp=new char[40];
	char * lpchar=lp;
	lpchar++;
	short * lpshort=(short *)lp;
	lpshort++;
	int * lpint=(int *)lp;
	lpint++;
这一段C++代码经编译后是这样的:
push    eax
push    offset s_ITTRCore_code 
push    28h
call    operator new[](uint,char const *,int)
add     esp, 0Ch
mov     [ebp+var_104], eax  ;char * lp=new char[40];
mov     ecx, [ebp+var_104]
mov     [ebp+var_14], ecx   ;
mov     eax, [ebp+var_14]
mov     [ebp+var_20], eax   ;char * lpchar=lp;
mov     eax, [ebp+var_20]
add     eax, 1              
mov     [ebp+var_20], eax
mov     eax, [ebp+var_14]
mov     [ebp+var_2C], eax   ;short * lpshort=(short *)lp;
mov     eax, [ebp+var_2C]
add     eax, 2
mov     [ebp+var_2C], eax
mov     eax, [ebp+var_14]
mov     [ebp+var_38], eax   int * lpint=(int *)lp;
mov     eax, [ebp+var_38]
add     eax, 4
mov     [ebp+var_38], eax
编译器自动换算了。
PDD123 2014-03-22
  • 打赏
  • 举报
回复
这是编译器的事情,在进行指针类型转换的时候,只不过告诉了编译器,指针是指向什么类型的,然后进行指针运算的时候,编译器就按照类型来计算。 比如在计算指针+n的时候,编译器实际上是计算了+n*类型大小。
  • 打赏
  • 举报
回复
指针有效的部分是一个地址。根据地址是无法判断指针类型的。 根据指针类型,可以判断指针运算的伸缩。 变量在声明的时候已经确定了类型。
sdu_sky 2014-03-21
  • 打赏
  • 举报
回复
指针代表指向数据的首地址,指针类型指示了从首地址开始的字节数量。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧