马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 熊小丹小熊 于 2015-4-22 22:50 编辑
请问reinterpret_cast强制类型转换和基本的强制转换有什么区别呢?
下面是以前小甲鱼的一个关于reinterpret_cast强制转换的一个例子:
#include <iostream>
int main()
{
const unsigned short ITEMS = 5; //用const定义数组的大小
int intArray[ITEMS] = {1, 2, 3, 4, 5}; //定义一个整型数组
char charArray[ITEMS] = {'F', 'i', 's', 'h', 'C'}; //定义一个字符型数组
int *intPtr = intArray; //定义一个指向整型数组的指针
char *charPtr = charArray; //定义一个指向字符型数组的指针
std::cout << "整型数组输出: " << '\n';
for(int i=0; i < ITEMS; i++ ) //循环输出整型数组每个元素以及对应的指针
{
std::cout << *intPtr << " at " << reinterpret_cast<unsigned int>(intPtr) << '\n'; //用reinterpret_cast把指针类型强制转换为unsigned int
intPtr++;
}
std::cout << "字符型数组输出: " << '\n'; //循环输出字符型数组每个元素以及对应的指针
for( i=0; i < ITEMS; i++ )
{
std::cout << *charPtr << " at " << reinterpret_cast<unsigned int>(charPtr)<< '\n'; //用reinterpret_cast把指针类型强制转换为unsigned int
charPtr++;
}
return 0;
}
输出的是两个数组的每个元素,以及对应指针指向的地址,地址被reinterpret_cast强制转换为连续的无符号整型
运行结果如下:
但是我想知道为什么这里不用看上去比较简洁的基本的强制类型换转(unsigned int)呢?
我试着把上面程序的第二个字符型数组的指针用基本的强制类型转换转换成无符号整型,编译没有问题,运行也没有问题,结果也是一样的。
代码如下:#include <iostream>
int main()
{
const unsigned short ITEMS = 5; //用const定义数组的大小
int intArray[ITEMS] = {1, 2, 3, 4, 5}; //定义一个整型数组
char charArray[ITEMS] = {'F', 'i', 's', 'h', 'C'}; //定义一个字符型数组
int *intPtr = intArray; //定义一个指向整型数组的指针
char *charPtr = charArray; //定义一个指向字符型数组的指针
std::cout << "整型数组输出: " << '\n';
for(int i=0; i < ITEMS; i++ ) //循环输出整型数组每个元素以及对应的指针
{
std::cout << *intPtr << " at " << reinterpret_cast<unsigned int>(intPtr) << '\n'; //用reinterpret_cast把指针类型强制转换为unsigned int
intPtr++;
}
std::cout << "字符型数组输出: " << '\n'; //循环输出字符型数组每个元素以及对应的指针
for( i=0; i < ITEMS; i++ )
{
std::cout << *charPtr << " at " << (unsigned int)charPtr<< '\n'; //用基本类型转换把指针类型强制转换为unsigned int
charPtr++;
}
return 0;
}
运行结果如下
|