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

2023-11-27 10:24:11 浏览数 (2)

一、重新解释类型转换 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_WorkSpace02_VSHelloWorldHelloWorldTest.cpp(10,9): error C2440: “=”: 无法从“char *”转换为“int *”
1>Y:02_WorkSpace02_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_WorkSpace02_VSHelloWorldHelloWorldTest.cpp(22,27): error C2440: “static_cast”: 无法从“char *”转换为“int *”
1>Y:02_WorkSpace02_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* 类型输出 : 屯屯屯屯屯屯屯屯 , 输出的是字符串 ;
代码语言:javascript复制
	// char* 类型输出 : 屯屯屯屯屯屯屯屯
	cout << p1 << endl;
  • int* 类型输出 : 00DA79D8 , 输出的是 int 类型的值 ;
代码语言:javascript复制
	// 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
请按任意键继续. . .

0 人点赞