整型与指针的相互转换(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);一句可见:
将指针转换为整型其结果是将十六进制的地址转换为十进制的地址!
- 整型与指针的相互转换(int<->int*,long<->long*)
- int与long long之间的转换
- int long String与字节数组的相互转换
- int 与 long 、long long
- long(Long)与int(Integer)之间的转换
- java中int、long与byte数组相互转换
- String与int、long、float、double等相互转换
- byte[]到short、int、long的相互转换
- byte[]到short、int、long的相互转换
- byte[]到short、int、long的相互转换
- byte[]到short、int、long的相互转换
- long long 与int的区别
- long long 与int的区别
- DSP28335的long与int
- __int64 与 long long int
- __int64 与long long int
- __int64 与long long int
- int ,long ,long long
- 在shell下创建快捷的查找命令
- JTable DefaultTableModel
- 《心的舞台》-歌词
- 深信服 linux软件开发面试题整理
- Android增加
- 整型与指针的相互转换(int<->int*,long<->long*)
- 安装redhat时中文显示乱码(小方框)及中文输入法安装解决方法
- 《即刻出发》
- 时间串变成Date类型的数据
- C++_运算符重载
- Android学习笔记11---_查看与输出日志信息
- js中select控件不能通过getElementById来获取。
- 2013年软件考试报名
- 人间词话-王国维