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

文章目录

  • 一、重新解释类型转换 reinterpret_cast
    • 1、指针数据类型转换 - C 语言隐式类型转换报错 ( 转换失败 )
    • 2、指针数据类型转换 - C 语言显示类型强制转换 ( 转换成功 )
    • 3、指针数据类型转换 - C++ 静态类型转换 static_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* 指针 变量 ,

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

执行结果 :

在这里插入图片描述


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

执行结果 :

在这里插入图片描述


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

执行结果 :

在这里插入图片描述


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
请按任意键继续. . .

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/190442.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有关HarmonyOS-ArkTS的Http通信请求

一、Http简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在Web应用程序之间进行通信的协议&#xff0c;通过运输层的TCP协议建立连接、传输数据。Http通信数据以报文的形式进行传输。Http的一次事务包括一个请求和一个响应。 Http通信是基于客户端-服…

一盏茶的时间,入门 Node.js

一、.什么是 Node.js&#xff1f; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;用于构建高性能、可伸缩的网络应用。 它采用事件驱动、非阻塞 I/O 模型&#xff0c;使其在处理并发请求时表现出色。 二、安装 Node.js 首先&#xff0c;让我们从 Node.…

为社会做贡献的EasyDarwin 4.0.1发布了,支持视频点播、文件直播、摄像机直播、直播录像、直播回放、录像MP4合成下载

经过几个月的不懈努力和测试&#xff0c;最新的EasyDarwin 4.0版本总算是发布出来了&#xff0c;功能还是老几样&#xff1a;文件点播、视频直播&#xff08;支持各种视频源&#xff09;、直播录像与回放、录像合成MP4下载&#xff0c;稍稍看一下细节&#xff1a; 文件上传与点…

【代码随想录刷题】Day18 二叉树05------延伸题目练习

文章目录 1.【113】路径总和II1.1 题目描述1.2 解题思路1.3 java代码实现 2.【105】从前序与中序遍历序列构造二叉树2.1 题目描述2.2 java代码实现 【113】路径总和II 【105】从前序与中序遍历序列构造二叉树 1.【113】路径总和II 1.1 题目描述 给你二叉树的根节点 root 和一…

win11任务栏居中/靠左设置路径

win11任务栏居中/靠左设置路径 设置-个性化-任务栏-任务栏对齐方式

Java | The last packet sent successfully to the server was xxx milliseconds ago

最近在部署代码后&#xff0c;后端总是会遇到这个问题&#xff0c;设备通道在访问数据库时经常会报错&#xff0c;在搜集大量资料后我以为是配置问题&#xff0c;首先要保证&#xff1a; &#xff08;1&#xff09;首先确定jdbc.url地址是正确的 &#xff08;2&#xf…

林曦的小世界:不在担心与顾虑中蹉跎时间,Just Do It

内容来自林曦的小世界      先提问&#xff1a;你有没有过这样的经历&#xff0c;一项很想学的技艺&#xff0c;一件想做许久的事情&#xff0c;却始终下不了决心&#xff0c;担心左&#xff0c;担心右&#xff0c;彷徨犹豫间&#xff0c;时间过去了&#xff0c;这件事仍未…

JsonRPC协议详解(协议介绍、请求示例、响应示例)

JsonRPC协议详解 什么是RPC&#xff1f; RPC&#xff08;远程过程调用&#xff09;是一种用于实现分布式系统中不同进程或不同计算机之间通信的技术。它允许我们像调用本地函数一样调用远程计算机上的函数&#xff0c;使得分布式系统的开发变得更加简单和高效。 什么是JsonRP…

【Docker】从零开始:11.Harbor搭建企业镜像仓库

【Docker】从零开始&#xff1a;11.Harbor搭建企业镜像仓库 1. Harbor介绍2. 软硬件要求(1). 硬件要求(2). 软件要求 3.Harbor优势4.Harbor的误区5.Harbor的几种安装方式6.在线安装(1).安装composer(2).配置内核参数,开启路由转发(3).下载安装包并解压(4).创建并修改配置文件(5…

WebUI自动化学习(Selenium+Python+Pytest框架)001

开启另一篇学习之路_WebUI自动化 先来一波基础概念 1.自动化适合什么类型的项目: 重复性高,迭代频率高的回归测试。数据量大、手工难以实现的压力测试&#xff0c;手工执行效率低的兼容测试 2.自动化的优点: 高效率、可重复、减少人为错误、克服手工测试的局限性 3.自动化…

Java基于SpringBoot+vue的租房网站设计与实现(V2.0)

文章目录 一、前言介绍二、主要技术三、系统设计&#xff08;部分&#xff09;3.1、主要功能模块设计3.2、系统登录设计 四、数据库设计&#xff08;部分&#xff09;五、运行截图5.1、 **管理员** **登录****5.2、管理员功能模块**5.2.1、用户管理5.2.2、房屋类型管理5.2.3、房…

CountDownLatch实战应用——批量数据多线程协调异步处理(子线程执行事务回滚)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; CountDownLatch实战应用——批量数据多线程协调异步处理(子线程执行事务…

Docker 部署 Nacos(单机),利用 MySQL 数据库存储配置信息

前面的话 默认你已经懂 Docker、docker-compose Nacos版本&#xff1a;v2.2.3 MySQL 版本&#xff1a;8.2.0 一、下载 打开 Nacos 官网 官网地址&#xff1a;官网 点击手册 左侧 Nacos Docker 克隆项目到本地 # 克隆项目&#xff0c;如果提示连接不到 github 请自行解决 …

【数据结构】树的概念以及二叉树

目录 1 树概念及结构 1.1 树的概念 1.3 树的存储 2 二叉树的概念及结构 2.1 概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 1 树概念及结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组…

「Verilog学习笔记」非整数倍数据位宽转换24to128

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 要实现24bit数据至128bit数据的位宽转换&#xff0c;必须要用寄存器将先到达的数据进行缓存。24bit数据至128bit数据&#xff0c;相当于5个输入数据第6个输入数据的拼接成一…

AR眼镜双目光波导/主板硬件方案

AR(增强现实)技术的发展离不开光学元件&#xff0c;而在其中&#xff0c;光波导和Micro OLED被视为AR眼镜光学方案的黄金搭档。光学元件在AR行业中扮演着核心角色&#xff0c;其成本高昂且直接影响用户体验的亮度、清晰度和大小等因素。AR眼镜的硬件成本中&#xff0c;光机部分…

测试工程师必学看系列之Jmeter_性能测试:性能测试的流程和术语

性能测试的流程 一、准备工作 1、系统基础功能验证 一般情况下&#xff0c;只有在系统基础功能测试验证完成、系统趋于稳定的情况下&#xff0c;才会进行性能测试&#xff0c;否则性能测试是无意义的。2、测试团队组建 根据该项目的具体情况&#xff0c;组建一个几人的性能测试…

【刷题宝典NO.5】

有效的括号 https://leetcode.cn/problems/valid-parentheses/ 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必…

Hugging Face宣布最受欢迎的AI机构,开源模型ChatGLM-6B广受认可

近日&#xff0c;Hugging Face作为开源AI社区的代表&#xff0c;总结了社区最欢迎的前15个公司和机构&#xff0c;几乎囊括了全部国内外风头正盛的AI科技机构&#xff0c;Stability AI、Meta AI、Runway占据排名前三&#xff0c;大众熟知的OpenAI、谷歌、微软也榜上有名。 其中…

C语言—冒泡排序

方法一&#xff08;不使用函数解决&#xff09; #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int arr[]{15,52,23,0,5,6,45,8,9,10};int i0;int j0;for ( i 0; i < 9; i){int flag1; //flag判断数组元素是否有序&#xff0c;这里先假设…
最新文章