一、重新解释类型转换 reinterpret_cast
C 静态类型转换 static_cast 可以完成 数据类型 转换 , 如 将 int 转为 double , 将 bool 转为 char , 等场景 ;
但是 对于 指针数据类型 , 就不能再使用 静态类型转换 static_cast ;
1、指针数据类型转换 - C 语言隐式类型转换报错 ( 转换失败 )
先讨论下 C 语言的 隐式类型转换 , 给一个 char* 指针 , 和 int* 指针 , 尝试将 int* 指针变量值赋值给 char* 指针 变量 ,
代码语言:javascript复制 char* p1 = new char[16];
int* p2 = NULL;
// 使用 C 语言的隐式转换
p2 = p1;
此时会报错 : error C2440: “=”: 无法从“char *”转换为“int *” ,
代码语言:javascript复制1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>Y: 02_WorkSpace 02_VSHelloWorldHelloWorldTest.cpp(10,9): error C2440: “=”: 无法从“char *”转换为“int *”
1>Y: 02_WorkSpace 02_VSHelloWorldHelloWorldTest.cpp(10,7): message : 与指向的类型无关;强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
得出结论 , C 语言的 隐式类型转换 , 不能进行 指针类型的转换 ;
代码示例 :
代码语言:javascript复制#include "iostream"
using namespace std;
int main() {
// 指针数据类型转换
// 将 char* 类型 转为 int* 类型
char* p1 = new char[16];
int* p2 = NULL;
// 使用 C 语言的隐式转换 报错
// 报错 : error C2440: “=”: 无法从“char *”转换为“int *”
// message : 与指向的类型无关;
// 强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
p2 = p1;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
2、指针数据类型转换 - C 语言显示类型强制转换 ( 转换成功 )
使用 C 语言显示类型强制转换 , 可以将 char* 类型 转为 int* 类型 , 这是 C 语言的用法 ;
代码示例 :
代码语言:javascript复制#include "iostream"
using namespace std;
int main() {
// 指针数据类型转换
// 将 char* 类型 转为 int* 类型
char* p1 = new char[16];
int* p2 = NULL;
// 使用 C 语言的隐式转换 报错
// 报错 : error C2440: “=”: 无法从“char *”转换为“int *”
// message : 与指向的类型无关;
// 强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
//p2 = p1;
// 使用 C 语言的隐式转换
p2 = (int*)p1;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
3、指针数据类型转换 - C 静态类型转换 static_cast ( 转换失败 )
使用 C 静态类型转换 static_cast , 将 char* 类型指针 转为 int* 类型指针 ,
该操作会报错 error C2440: “static_cast”: 无法从“char *”转换为“int *” ;
代码语言:javascript复制1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>Y: 02_WorkSpace 02_VSHelloWorldHelloWorldTest.cpp(22,27): error C2440: “static_cast”: 无法从“char *”转换为“int *”
1>Y: 02_WorkSpace 02_VSHelloWorldHelloWorldTest.cpp(22,7): message : 与指向的类型无关;强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
代码示例 :
代码语言:javascript复制#include "iostream"
using namespace std;
int main() {
// 指针数据类型转换
// 将 char* 类型 转为 int* 类型
char* p1 = new char[16];
int* p2 = NULL;
// 使用 C 语言的隐式转换 报错
// 报错 : error C2440: “=”: 无法从“char *”转换为“int *”
// message : 与指向的类型无关;
// 强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
//p2 = p1;
// 使用 C 语言的隐式转换
// 可以实现 指针类型 转换功能
//p2 = (int*)p1;
// 使用 C 静态类型转换
// 报错 : error C2440: “static_cast”: 无法从“char *”转换为“int *”
// message : 与指向的类型无关;
// 强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
p2 = static_cast<int*>(p1);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
4、指针数据类型转换 - C 重新解释类型转换 reinterpret_cast ( 转换成功 )
使用 重新解释类型转换 reinterpret_cast , 将 char* 类型指针 强制 重新解释称 int* 类型的指针 ;
代码语言:javascript复制 // 使用 C 重新解释类型转换 reinterpret_cast
// 将 char* 类型指针 强制 重新解释称 int* 类型的指针
p2 = reinterpret_cast<int*>(p1);
cout 输出数据时 , 会按照变量类型 对变量进行输出 ,
输出 char* 类型指针 与 输出 int* 类型指针 输出结果不同 ;
在下面的代码中 ,
- char* 类型输出 : 屯屯屯屯屯屯屯屯 , 输出的是字符串 ;
// char* 类型输出 : 屯屯屯屯屯屯屯屯
cout << p1 << endl;
- int* 类型输出 : 00DA79D8 , 输出的是 int 类型的值 ;
// int* 类型输出 : 00DA79D8
cout << p2 << endl;
代码示例 :
代码语言:javascript复制#include "iostream"
using namespace std;
int main() {
// 指针数据类型转换
// 将 char* 类型 转为 int* 类型
char* p1 = new char[16];
int* p2 = NULL;
// 使用 C 语言的隐式转换 报错
// 报错 : error C2440: “=”: 无法从“char *”转换为“int *”
// message : 与指向的类型无关;
// 强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
//p2 = p1;
// 使用 C 语言的隐式转换
// 可以实现 指针类型 转换功能
//p2 = (int*)p1;
// 使用 C 静态类型转换
// 报错 : error C2440: “static_cast”: 无法从“char *”转换为“int *”
// message : 与指向的类型无关;
// 强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
//p2 = static_cast<int*>(p1);
// 使用 C 重新解释类型转换 reinterpret_cast
// 将 char* 类型指针 强制 重新解释称 int* 类型的指针
p2 = reinterpret_cast<int*>(p1);
// cout 会按照变量类型 对变量进行输出
// 输出 char* 类型指针 与 输出 int* 类型指针 输出结果不同
// char* 类型输出 : 屯屯屯屯屯屯屯屯
cout << p1 << endl;
// int* 类型输出 : 00DA79D8
cout << p2 << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
代码语言:javascript复制屯屯屯屯屯屯屯屯
00DA79D8
请按任意键继续. . .