在之前写过一篇 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 语言隐式转换的弊端 ;





一、重新解释类型转换 reinterpret_cast



C++ 静态类型转换 static_cast 可以完成 数据类型 转换 , 如 将 int 转为 double , 将 bool 转为 char , 等场景 ;

但是 对于 指针数据类型 , 就不能再使用 静态类型转换 static_cast ;


1、指针数据类型转换 - C 语言隐式类型转换报错 ( 转换失败 )


先讨论下 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++】类型转换 ③ ( 重新解释类型转换 reinterpret_cast | 指针类型数据转换 )-LMLPHP

得出结论 , 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++】类型转换 ③ ( 重新解释类型转换 reinterpret_cast | 指针类型数据转换 )-LMLPHP


2、指针数据类型转换 - C 语言显示类型强制转换 ( 转换成功 )


使用 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++】类型转换 ③ ( 重新解释类型转换 reinterpret_cast | 指针类型数据转换 )-LMLPHP


3、指针数据类型转换 - C++ 静态类型转换 static_cast ( 转换失败 )


使用 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;
};

执行结果 :

【C++】类型转换 ③ ( 重新解释类型转换 reinterpret_cast | 指针类型数据转换 )-LMLPHP


4、指针数据类型转换 - C++ 重新解释类型转换 reinterpret_cast ( 转换成功 )


使用 重新解释类型转换 reinterpret_cast , 将 char* 类型指针 强制 重新解释称 int* 类型的指针 ;

	// 使用 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;

代码示例 :

#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;
};

执行结果 :

屯屯屯屯屯屯屯屯
00DA79D8
请按任意键继续. . .

【C++】类型转换 ③ ( 重新解释类型转换 reinterpret_cast | 指针类型数据转换 )-LMLPHP

11-26 18:52