ULONG_PTR到底是什么?

hhh_hao 2011-03-25 11:12:47
看到PTR想当然就把它当指针了, 但是它的定义是下面这样的, _W64是什么意思? Debug的监视窗口显示的类型是unsigned long, 望高手指点下。

typedef _W64 unsigned long ULONG_PTR

...全文
4527 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
freeishwk 2013-11-14
  • 打赏
  • 举报
回复
2楼3楼说的不是一样吗……
hhh_hao 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lactoferrin 的回复:]

ULONG_PTR就是能够装得下指针的无符号整数,
[/Quote]

不是很明白这句话的意思,
Lactoferrin 2011-03-25
  • 打赏
  • 举报
回复
在进行指针的整数运算时可以用ULONG_PTR作类型转换
Lactoferrin 2011-03-25
  • 打赏
  • 举报
回复
ULONG_PTR就是能够装得下指针的无符号整数,在32位被定义成unsigned long,在64位被定义成unsigned __int64
w64是如果是64位则警告
hhh_hao 2011-03-25
  • 打赏
  • 举报
回复
2楼和3楼好像是矛盾的呀, 谁能给个确定的答复呢?
秃头披风侠 2011-03-25
  • 打赏
  • 举报
回复 1
无符号(u) 长整型(long) 指针(ptr)
zhh_kv 2011-03-25
  • 打赏
  • 举报
回复
1. ULONG_PTR 只是专门用于内核程序 (Kernel 或 Device Driver) 使用的数据类型,
当作指针时它应当指向系统内核地址空间 (因此最高位为 1),另外它还可当作偏移量。
2.
定义:
ULONG_PTR

Unsigned LONG_PTR.
This type is declared in Basetsd.h as follows:

#if defined(_WIN64)
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winprog/winprog/windows_data_types.asp
pathuang68 2011-03-25
  • 打赏
  • 举报
回复
继续查找_W64。

从ULONG_PTR本身来看,应该是一个无符号long型指针。
U = unsigned
LONG = long
PTR = pointer

所以,ULONG_PTR就是 unsigned long *,GDI+中好像就是这么定义的。
Lactoferrin 2011-03-25
  • 打赏
  • 举报
回复
x64中unsigned long是32位的,因此用_w64报警
实际上有
#if defined(_WIN64)
typedef __int64 INT_PTR, *PINT_PTR;
typedef unsigned __int64 UINT_PTR, *PUINT_PTR;

typedef __int64 LONG_PTR, *PLONG_PTR;
typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;

#define __int3264 __int64

#else
typedef _W64 int INT_PTR, *PINT_PTR;
typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;

typedef _W64 long LONG_PTR, *PLONG_PTR;
typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;

#define __int3264 __int32

#endif
#endif

x64下ULONG_PTR是64位的,x86下ULONG_PTR是32位的,目的就是保证和指针一样大
碎碎念 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 hhh_hao 的回复:]
看到PTR想当然就把它当指针了, 但是它的定义是下面这样的, _W64是什么意思? Debug的监视窗口显示的类型是unsigned long, 望高手指点下。
C/C++ code

typedef _W64 unsigned long ULONG_PTR
[/Quote]

ULONG_PTR表示64位无符号整形。。。通常用来存放64位地址。。。
Lactoferrin 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hhh_hao 的回复:]

那就是说它还是个指针,它的值是地址,可以这样理解吗?
[/Quote]
ULONG_PTR是个整数型,能够保证它放得下地址,这个只是在c语言等区分整形和指针,用汇编就没区别了
龙行天下之Sky 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhh_steven 的回复:]

1. ULONG_PTR 只是专门用于内核程序 (Kernel 或 Device Driver) 使用的数据类型,
当作指针时它应当指向系统内核地址空间 (因此最高位为 1),另外它还可当作偏移量。
2.
定义:
ULONG_PTR

Unsigned LONG_PTR.
This type is declared in Basetsd.h as follows:

#i……
[/Quote]

从定义字面理解就是:unsigned long *类型
hhh_hao 2011-03-25
  • 打赏
  • 举报
回复
那就是说它还是个指针,它的值是地址,可以这样理解吗?
Lactoferrin 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hhh_hao 的回复:]

引用 5 楼 lactoferrin 的回复:

ULONG_PTR就是能够装得下指针的无符号整数,


不是很明白这句话的意思,
[/Quote]
指针放的是地址,就是一个整数,有时需要让指针参与整数运算,但是c语言里面的指针不能直接算,就要用类型转换成整数类型再算

但是不同类型的计算机指针尺寸是不一样的,比如32位机中指针和unsigned long一样大,占4字节,64位机中和unsigned __int64一样大,占8字节

这样在针对32位的源代码和64位的源代码就不一样,如果用ULONG_PTR,就可以统一

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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