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

来源:互联网 发布:g92英制螺纹编程实例 编辑:程序博客网 时间:2024/05/17 01:59

最近看代码,碰到这么一个数据结构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;\n");
printf("Value of i is %d, address of i is 0x%x\n",i,&i);
printf("int *p = &i;\n");
printf("Adress of Pointer P is: 0x%x, Value of P is: 0x%x=%d, Value of P pointed is: %d\n",&p,p,p,*p);
if(p==&i)
printf("Value of p is the address of i\n");
printf("Value of j is %d\n",j);
printf("Value of j is 0x%x\n",j);
printf("Value of j pointed is: %d\n",*(int*)j);

}

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

运行结果:


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

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

原创粉丝点击