社区
C++ 语言
帖子详情
ULONG_PTR到底是什么?
hhh_hao
2011-03-25 11:12:47
看到PTR想当然就把它当指针了, 但是它的定义是下面这样的, _W64是什么意思? Debug的监视窗口显示的类型是unsigned long, 望高手指点下。
typedef _W64 unsigned long ULONG_PTR
...全文
5222
14
打赏
收藏
ULONG_PTR到底是什么?
看到PTR想当然就把它当指针了, 但是它的定义是下面这样的, _W64是什么意思? Debug的监视窗口显示的类型是unsigned long, 望高手指点下。 typedef _W64 unsigned long ULONG_PTR
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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,就可以统一
U
LONG
_
PTR
与U
LONG
U
LONG
Unsigned
LONG
. The range is 0 through 4294967295 decimal. This type is declared in WinDef.h as follows: typedef unsigned
long
U
LONG
; 在VS2010中使用U
LONG
时,需加上头文件#include,否则出现inllisense:
U
LONG
_
PTR
的作用
U
LONG
_
PTR
就是能够装得下指针的无符号整数,在32位被定义成unsigned
long
,在64位被定义成unsigned __int64,w64是如果是64位则警告。所以,U
LONG
_
PTR
就是 unsigned
long
*,GDI+中好像就是这么定义的。指针不支持比较大小,将指针转换成U
LONG
_
PTR
类型,可以比较大小。从U
LONG
_
PTR
本身来看,应该是一个无符号
long
型指针。在进行指针的整数运算时可以用U
LONG
_
PTR
作类型转换。
U
LONG
_
PTR
类型详解
U
LONG
_
PTR
// 32位系统下// 4字节 (32位)// 64位系统下// 8字节 (64位)
error C2872: U
LONG
_
PTR
: ambiguous symbol 问题的解决
error C2872: 'U
LONG
_
PTR
' : ambiguous symbol 问题的解决 在做DTE addin插件开发的时候,使用了atl的CString,出现如下的错误 vc\atlmfc\include\cstringt.h(2508): error C2872: 'U
LONG
_
PTR
' : ambiguous symbol //省略错误信息 原因是basetsd.h(
error C2664: “void Gdiplus::GdiplusShutdown(U
LONG
_
PTR
)”: 无法将参数 1 从“unsigned
long
*”转换为“U
LONG
_
PTR
”
具体来说,`GdiplusShutdown` 函数期望一个 `U
LONG
_
PTR
` 类型的参数,但你传递的参数是 `unsigned
long
*` 类型。确保你传递给 `GdiplusShutdown` 的参数是 `U
LONG
_
PTR
` 类型,而不是指向 `unsigned
long
` 的指针。1. **正确的参数类型**:确保 `gdiplusToken` 是 `U
LONG
_
PTR
` 类型,并且在调用 `GdiplusShutdown` 时直接传递该变量,而不是其地址。
C++ 语言
65,210
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章