在之前写过一篇 C++ 类型转换的博客 【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 ) , 简单介绍了 C++ 类型转换 ;
在 博客 【C++】类型转换 ① ( C 中的类型转换 | C++ 类型转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast ) 将 C 语言 和 C++ 中的类型转换进行了对比 ;
在 博客 【C++】类型转换 ② ( C++ 静态类型转换 static_cast | C 语言隐式转换弊端 | 代码示例 ) 中 , 主要分析了 静态类型转换 static_cast , 可以解决 C 语言隐式转换的弊端 ;
C++ 静态类型转换 static_cast 可以完成 数据类型 转换 , 如 将 int 转为 double , 将 bool 转为 char , 等场景 ;
但是 对于 指针数据类型 , 就不能再使用 静态类型转换 static_cast ;
先讨论下 C 语言的 隐式类型转换 , 给一个 char* 指针 , 和 int* 指针 , 尝试将 int* 指针变量值赋值给 char* 指针 变量 ,
char* p1 = new char[16];
int* p2 = NULL;
// 使用 C 语言的隐式转换
p2 = p1;
此时会报错 : error C2440: “=”: 无法从“char *”转换为“int *” ,
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(10,9): error C2440: “=”: 无法从“char *”转换为“int *”
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(10,7): message : 与指向的类型无关;强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
得出结论 , C 语言的 隐式类型转换 , 不能进行 指针类型的转换 ;
代码示例 :
#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;
};
执行结果 :
使用 C 语言显示类型强制转换 , 可以将 char* 类型 转为 int* 类型 , 这是 C 语言的用法 ;
代码示例 :
#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;
};
执行结果 :
使用 C++ 静态类型转换 static_cast , 将 char* 类型指针 转为 int* 类型指针 ,
该操作会报错 error C2440: “static_cast”: 无法从“char *”转换为“int *” ;
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(22,27): error C2440: “static_cast”: 无法从“char *”转换为“int *”
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(22,7): message : 与指向的类型无关;强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
代码示例 :
#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;
};
执行结果 :
使用 重新解释类型转换 reinterpret_cast , 将 char* 类型指针 强制 重新解释称 int* 类型的指针 ;
// 使用 C++ 重新解释类型转换 reinterpret_cast
// 将 char* 类型指针 强制 重新解释称 int* 类型的指针
p2 = reinterpret_cast<int*>(p1);
cout 输出数据时 , 会按照变量类型 对变量进行输出 ,
输出 char* 类型指针 与 输出 int* 类型指针 输出结果不同 ;
在下面的代码中 ,
// char* 类型输出 : 屯屯屯屯屯屯屯屯
cout << p1 << endl;
// int* 类型输出 : 00DA79D8
cout << p2 << endl;
代码示例 :
#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(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;
};
执行结果 :
屯屯屯屯屯屯屯屯
00DA79D8
请按任意键继续. . .