牛骨文教育服务平台(让学习变的简单)
博文笔记

整型与指针的相互转换(int<->int*,long<->long*)

创建时间:2013-03-04 投稿人: 浏览次数:3525

最近看代码,碰到这么一个数据结构ULONG_PTR,看到PTR以为是指针类型(PoinTeR),但追到windows定义发现居然是整型:unsigned long,而不是指针!

<BaseTsd.h> 定义中定义如下:typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;

_W64被32位编译器忽略,被64位编译器解读为long占64位,long*占64位,不然long和long*依旧解读为int和int*,占32位。

_PTR后缀称为指针精度数据类型,确实是PoinTeR的意思,但不代表数据类型是指针。

ULONG_PTR就是unsigned long,PULONG_PTR才是之前认为的指针类型。指针数据精度具有多态的特性,如上文所述,根据编译器是否是64位的选择是否将相关指针、整型解读为64位的。

_PTR数据的出现是为了使同一个代码既可以编译为32位系统的版本也可以编译为64位系统的版本。



由于int和int*都是4个字节,区别就在于编译器对他们的解释和操作不同,

1)对于用int标记的区域,编译器直接取相应变量对应地址的值,并返回该值;对于int*标记的内存,允许*操作,去该内存空间中的值,并以该值进行寻址,取相应地址的值返回。

2)int*标记区域的内存值只允许加减运算,而int标记区域的值允许各种算术运算。因此int与int*之间是可以相互转化的,只是转化完编译器会做出不同的解释,程序员应保证解释的内容符合逻辑和目的。


long与long*同理也可以相互转换,ULONG_PTR和PULONG_PTR也可以相互转换。


参考代码:

-------------------------代码开始---------------------------------------------------

void main(){

int i = 5;
int *p = &i;
int j = (int)p;//十六进制转二进制


printf("int i = 5; ");
printf("Value of i is %d, address of i is 0x%x ",i,&i);
printf("int *p = &i; ");
printf("Adress of Pointer P is: 0x%x, Value of P is: 0x%x=%d, Value of P pointed is: %d ",&p,p,p,*p);
if(p==&i)
printf("Value of p is the address of i ");
printf("Value of j is %d ",j);
printf("Value of j is 0x%x ",j);
printf("Value of j pointed is: %d ",*(int*)j);

}

----------------------------代码结束--------------------------------------------

运行结果:


尤其printf("Adress of Pointer P is: 0x%x, Value of P is: 0x%x=%d, Value of P pointed is: %d ",&p,p,p,*p);一句可见:

将指针转换为整型其结果是将十六进制的地址转换为十进制的地址!

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。