int型为什么可以转换为指针类型的句柄?

senkobqb 2008-05-05 10:10:23
最近看windows编程,看到创建子窗口的ID字段时用的是 (HMENU)i; 注:i被定义为int型。

我不明白的是这里为什么能把int型强制转换成指针型的HMENU(即struct HMENU__ *)型呢? 大家帮解释一下。

这是winnt.h里面的一小段。

#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;


例子程序:

#include <stdio.h>

typedef struct tagmyHandle
{
int unused;

} *HmyHandle;


int main()
{
int i = 8;

HmyHandle myHandle = (HmyHandle)i; //这里为什么可以直接从int型强制转换成struct tagmyHanle * 型的??

printf("%d\n", myHandle); //这里可以输出8 ,怎么回事?如果直接用&i 就不对了。

return 0;
}
...全文
1037 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
chlaws 2008-05-05
  • 打赏
  • 举报
回复
问题已解决,鉴定完毕
babyvox1999 2008-05-05
  • 打赏
  • 举报
回复
所以叫做强制转换。。。
Ethan_yushui213 2008-05-05
  • 打赏
  • 举报
回复
HmyHandle myHandle = (HmyHandle)i; //这里为什么可以直接从int型强制转换成struct tagmyHanle * 型的??
在32位机器中,指针一般用32位数表示,也就是4个字节,而int类型也是4个字节的,所有编译器允许转换

printf("%d\n", myHandle); //这里可以输出8 ,怎么回事?如果直接用&i 就不对了。
如果采用&i,则对应输出i的地址,而myHandle这时是i的值(其实是一个地址)所指向的内存的值。
baihacker 2008-05-05
  • 打赏
  • 举报
回复
HmyHandle是指针类型
HmyHandle myHandle = (HmyHandle)i; 意思是让左边的指针的值为9,也就是指向内存0x00000008
printf("%d\n", myHandle); 输出了这个指针的值

请分清楚指针的值,和指针指向的值

#include <iostream>
using namespace std;

int main()
{
void* p = (void*)8;
printf("%d\n", p);
return 0;
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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