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

文章目录

  • [一、重新解释类型转换 reinterpret_cast](#一、重新解释类型转换 reinterpret_cast)
    • [1、指针数据类型转换 - C 语言隐式类型转换报错 ( 转换失败 )](#1、指针数据类型转换 - C 语言隐式类型转换报错 ( 转换失败 ))
    • [2、指针数据类型转换 - C 语言显示类型强制转换 ( 转换成功 )](#2、指针数据类型转换 - C 语言显示类型强制转换 ( 转换成功 ))
    • [3、指针数据类型转换 - C++ 静态类型转换 static_cast ( 转换失败 )](#3、指针数据类型转换 - C++ 静态类型转换 static_cast ( 转换失败 ))
    • [4、指针数据类型转换 - C++ 重新解释类型转换 reinterpret_cast ( 转换成功 )](#4、指针数据类型转换 - C++ 重新解释类型转换 reinterpret_cast ( 转换成功 ))

在之前写过一篇 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* 指针 变量 ,

cpp 复制代码
	char* p1 = new char[16];
	int* p2 = NULL;

	// 使用 C 语言的隐式转换
	p2 = p1;

此时会报错 : error C2440: "=": 无法从"char *"转换为"int *" ,

cpp 复制代码
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 语言的 隐式类型转换 , 不能进行 指针类型的转换 ;

代码示例 :

cpp 复制代码
#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 语言的用法 ;

代码示例 :

cpp 复制代码
#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 *" ;

cpp 复制代码
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 个 ==========

代码示例 :

cpp 复制代码
#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* 类型的指针 ;

cpp 复制代码
	// 使用 C++ 重新解释类型转换 reinterpret_cast
	// 将 char* 类型指针 强制 重新解释称 int* 类型的指针
	p2 = reinterpret_cast<int*>(p1);

cout 输出数据时 , 会按照变量类型 对变量进行输出 ,

输出 char* 类型指针 与 输出 int* 类型指针 输出结果不同 ;

在下面的代码中 ,

  • char* 类型输出 : 屯屯屯屯屯屯屯屯 , 输出的是字符串 ;
cpp 复制代码
	// char* 类型输出 : 屯屯屯屯屯屯屯屯
	cout << p1 << endl;
  • int* 类型输出 : 00DA79D8 , 输出的是 int 类型的值 ;
cpp 复制代码
	// int* 类型输出 : 00DA79D8
	cout << p2 << endl;

代码示例 :

cpp 复制代码
#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;
};

执行结果 :

cpp 复制代码
屯屯屯屯屯屯屯屯
00DA79D8
请按任意键继续. . .
相关推荐
迷迭所归处5 小时前
C++ —— 关于vector
开发语言·c++·算法
CV工程师小林5 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
white__ice6 小时前
2024.9.19
c++
天玑y6 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
姜太公钓鲸2336 小时前
c++ static(详解)
开发语言·c++
菜菜想进步6 小时前
内存管理(C++版)
c语言·开发语言·c++
Joker100857 小时前
C++初阶学习——探索STL奥秘——模拟实现list类
c++
科研小白_d.s7 小时前
vscode配置c/c++环境
c语言·c++·vscode
湫兮之风7 小时前
c++:tinyxml2如何存储二叉树
开发语言·数据结构·c++
友友马8 小时前
『 Linux 』HTTP(一)
linux·运维·服务器·网络·c++·tcp/ip·http