【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* 类型输出 : 00DA79D8cout << 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* 类型输出 : 00DA79D8cout << p2 << endl;// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Simulink 的代数环

代数环, 就是由于模型的输出反馈到模块或子系统先的某个输入端, 如果这个输入是直接馈入的, 那么二者在同一个采样点内需得到求解, 但又互相依赖, 哪一方都不能完成求解过程, 使得解算器无法解算导致错误产生, 这样的情况称为代数环。 一旦 Simulink 遇到代数环, 将根据 Confi…

python环境搭建-yolo代码跑通-呕心沥血制作(告别报错no module named torch)

安装软件 安装过的可以查看有没有添加环境变量 好的! 我们发车! 如果你想方便快捷的跑通大型项目,那么必须安装以下两个软件: 1.pycharm2.anaconda对应作用: pycharm:专门用来跑通python项目的软件,相当于一个编辑器,可以debug调试,可以接受远程链接调试!anaconda:专…

2023年初中生古诗文大会复选最后6天备考策略和更新的在线模拟题

今天是2023年11月26日&#xff0c;星期日&#xff0c;距离2023年第八届上海市中学生古诗文大会复选&#xff08;复赛&#xff09;还有六天&#xff08;2023年12月2日上午举办&#xff09;&#xff0c;相信各位晋级的小学霸们正在繁忙的学业之余抓紧备考。 为了帮助孩子们更有效…

thinkphp最新开发的物业管理系统 缴费管理、停车管理、收费管理、值班管理

物业费&#xff0c;水电燃气费&#xff0c;电梯费&#xff0c;租金&#xff0c;临时收费等多种收费规则完全自定义&#xff0c;账单自动生成&#xff0c;无需人工计算 实时数据互通&#xff1a;一键报事报修&#xff0c;购买车辆月卡&#xff0c;管理家人信息&#xff0c;参加物…

idea spring initializr创建项目报错

闲来无事就想搞个项目练练手&#xff0c;没想到直接给我卡在项目创建上了&#xff0c;一个个问题最终迎刃而解。 1.上来就给我报了个maven的错 未解析的插件: ‘org.apache.maven.plugins:maven-resources-plugin:3.3.1’ 不慌&#xff0c;应该是maven的路径有问题&#xff0c…

Redis缓存淘汰策略

Redis缓存淘汰策略 1、各种面试题 生产上你们的redis内存设置多少?如何配置、修改redis的内存大小如果内存满了你怎么办&#xff1f;redis清理内存的方式?定期删除和惰性删除了解过吗&#xff1f;redis缓存淘汰策略有哪些?分别是什么?你用哪个?redis的LRU了解过吗?请手…

AMESim与MATLAB联合仿真demo

本文是AMESim与MATLAB联合仿真的demo&#xff0c;记录一下如何进行联合仿真。 AMESim与MATLAB联合仿真可以大幅度提高工作效率。 author&#xff1a;xiao黄 缓慢而坚定的生长 csdn:https://blog.csdn.net/Python_Matlab?typeblog主页传送门 博主的联合仿真环境如下&#xff…

代码随想录算法训练营 ---第四十三天

前言&#xff1a; 今天同样是01背包问题&#xff0c;今天详细学习了背包问题在各种场景下的应用。今天一道也没做出来&#xff0c;有点废。好难啊&#xff01;就是思路不太清晰&#xff0c;不知道如何去做&#xff0c;看了题解后感觉原来如此&#xff0c;但是想不出来。今天做…

leetcode9.回文数

回文数 0.题目1.WJQ的思路2.实现过程2.0 原始值怎么一个个取出来&#xff1f;2.1 取出来的数如何存到新的数字后面&#xff1f;2.2完整的反转得到新数的过程 3.完整的代码4.可运行的代码5.算法还可以优化的部分 0.题目 给你一个整数 x &#xff0c;如果 x 是一个回文整数&…

IIC驱动OLED(SSD1306) HAL库+CubeMX

一.IIC传输数据的格式 1.写操作 2.读操作 3.IIC信号 二. IIC底层驱动 1.重新初始化配置延时单元 //软件延时 void I2C_Delay(uint32_t t) {volatile uint32_t tmp t;while(tmp--); }void I2C_GPIO_ReInit(void) {/* 1. 使用结构体定义硬件GPIO对象 */GPIO_InitTypeDef GPIO…

安装最新版WebStorm来开发JavaScript应用程序

安装最新版WebStorm来开发JavaScript应用程序 Install the Latest Version of JetBrains WebStorm to Develop JavaScript Applications By JacksonML 2023-11-25 1. 系统要求 WebStorm是个跨平台集成开发环境&#xff08;IDE&#xff09;。按照JetBrains官网对WebStorm软件…

【C++】类型转换 ② ( C++ 静态类型转换 static_cast | C 语言隐式转换弊端 | 代码示例 )

文章目录 一、静态类型转换 static_cast1、C 静态类型转换 static_cast2、C 语言隐式转换弊端3、代码示例 在之前写过一篇 C 类型转换的博客 【C 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 ) , 简单介绍了 C 类…

大数据基础 HDFS客户端操作

一、Maven概述 Maven是一个专门用于管理和构建Java项目的工具。我们之所以要使用Maven&#xff0c;是因为Maven可以为我们提供一套标准化的项目结构、一套标准化的构建流程和一套方便的依赖管理机制&#xff0c;这些功能可以使得我们的项目结构更加清晰&#xff0c;导入jar包的…

初学vue3与ts:setup与setup()下的数据写法

把setup写在script里 <template><div><div class"index-title">script setup</div><div class"title">字符串&#xff1a;</div><div class"title-sub">ref版&#xff1a;{{strRef}}</div><…

cocos游戏引擎制作的滚动框地图防止误点操作的简单方法

本篇文章主要讲解&#xff0c;使用cocos creator 来解决在我们日常滚动框开发中&#xff0c;滚动和触摸存在冲突的情况&#xff0c;导致的误触行为的解决办法。 日期&#xff1a;2023年11月25日 具体事项 说明&#xff1a;在我们滚动滚动框时&#xff0c;会出现误点的情况&…

Drools 7 JMX Mbean 及Metric 分析

Mbean mbean的打开很简单&#xff0c;使用jmx启动参数&#xff1a; -Dcom.sun.management.jmxremote.port9999 -Ddrools.mbeansenabled -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse 但通过jconsole能直观看到的东西也很…

利用 LD_PRELOAD 环境变量

文章目录 原理LD_PRELOAD介绍如何上传.so文件 例题 [虎符CTF 2022]ezphp 原理 LD_PRELOAD介绍 LD_PRELOAD是Linux系统的一个环境变量&#xff0c;它可以影响程序的运行时的链接&#xff08;Runtime linker&#xff09;&#xff0c;它允许你定义在程序运行前优先加载的动态链接…

DDD落地:从阿里单据系统,看DDD在大厂如何落地?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

职场份子钱随不随?这20个真相你需要知道!

职场份子钱随不随&#xff1f;这20个真相你需要知道&#xff01; 1.千万不要在老婆面前夸小姨子水灵。 2.盖世功劳&#xff0c;当不得一个矜字&#xff1b;弥天罪过&#xff0c;当不得一个悔字。 3.愚蠢的人永远只会根据答案判断难度。 4.改变自己的是神&#xff0c;企图改…

【数据库】表的连接在执行时的算法解析,嵌套循环连接算法的几种实现,多表连接中表的数量会影响什么

嵌套循环连接 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定期更新…