:如何可以把一个整形变量强制转换赋给一个整形指针,具体如下
求救:怎么可以把一个整形变量强制转换赋给一个整形指针,具体如下
int main()
{
int b = 123;
int* pb = (int*)(b);
int c = (int)pb;
cout << c << endl;
return 0;
}

------解决思路----------------------
是重新复制了i的值,为什么会通不过呢?复制一个指针值或者整型值不是一样的吗?
你说的例子中已经用了强制转换,参数类型正确,编译器也检查不出来了。
------解决思路----------------------
这种代码本来就有问题。
正确用法:
然后在ThreadFun:
------解决思路----------------------
可能你还不明白这样做的目的是什么
正常情况下把一个整数转换成指针只有两种原因:
- 一种是这个整数原本就是一个指针,比如某些类型的句柄
- 另一种是这个指针类型出于某种目的无法随意修改,而此时需要用这个指针传递的值根本就不是为了当作指针使用的。比如#4楼的那个例子,ThreadFun是个回调函数,不允许随意修改回调函数的形式,此时在ThreadFun里面pVoid也不是当真正的指针使用的。
把整数转换成指针要注意截断问题。根据sizeof(void*) == sizeof(intptr_t) >= sizeof(int) >= sizeof(int16_t)的规则,可以用指针传递的整型有char、int、int16_t、intptr_t这几种(后两者是stdint.h种定义的类型)及他们对应的无符号整数类型。传递除此以外的任何其他类型都是没有兼容性保证的。
而如果想用整数携带指针类型,具有这种能力的指针类型只有intptr_t和uintptr_t,除此以外的任何其他类型都是没有兼容性保证的。
int main()
{
int b = 123;
int* pb = (int*)(b);
int c = (int)pb;
cout << c << endl;
return 0;
}
------解决思路----------------------
是重新复制了i的值,为什么会通不过呢?复制一个指针值或者整型值不是一样的吗?
你说的例子中已经用了强制转换,参数类型正确,编译器也检查不出来了。
------解决思路----------------------
这种代码本来就有问题。
正确用法:
CreateThread(NULL, 0, ThreadFun, new int(i), 0, &dwThreadId ));
然后在ThreadFun:
DWORD WINAPI ThreadFun(LPVOID lp){
int* i = (int*)lp;
//....
delete i;
}
------解决思路----------------------
可能你还不明白这样做的目的是什么
正常情况下把一个整数转换成指针只有两种原因:
- 一种是这个整数原本就是一个指针,比如某些类型的句柄
- 另一种是这个指针类型出于某种目的无法随意修改,而此时需要用这个指针传递的值根本就不是为了当作指针使用的。比如#4楼的那个例子,ThreadFun是个回调函数,不允许随意修改回调函数的形式,此时在ThreadFun里面pVoid也不是当真正的指针使用的。
把整数转换成指针要注意截断问题。根据sizeof(void*) == sizeof(intptr_t) >= sizeof(int) >= sizeof(int16_t)的规则,可以用指针传递的整型有char、int、int16_t、intptr_t这几种(后两者是stdint.h种定义的类型)及他们对应的无符号整数类型。传递除此以外的任何其他类型都是没有兼容性保证的。
而如果想用整数携带指针类型,具有这种能力的指针类型只有intptr_t和uintptr_t,除此以外的任何其他类型都是没有兼容性保证的。