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

news2024/11/26 7:33:20

文章目录

  • 一、重新解释类型转换 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.coloradmin.cn/o/1255181.html

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

相关文章

思维模型 古烈治效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。见异思迁。 1 古烈治效应的应用 1.1 古烈治效应之心理学研究 在一项研究中&#xff0c;研究者让男性和女性参与者分别观看一系列异性的照片&#xff0c;并评估他们的吸引力。在观看完所有…

ns-3安装教程

1️⃣ VMware安装Ubuntu虚拟机 VMware安装Ubuntu 18.04虚拟机 6.桥接模式网络配置往后都不看 VMware16 安装Ubuntu22.04.1 服务器版操作系统教程 这块主要看怎么从清华镜像下载ubuntu 本人安装的是ubuntu22.04.3 2️⃣ 安装ns3 【ns-3】零基础安装教程 安装依赖库时遇到了问题 …

1998-2021年全国各省PM2.5平均浓度数据

1998-2021年全国各省PM2.5平均浓度数据 1、时间&#xff1a;1998-2021年 2、指标&#xff1a;省、省代码、年份、均值、总和、最小值、最大值、标准差 3、来源&#xff1a;华盛顿大学大气成分分析小组 4、范围&#xff1a;34省市 5、指标说明&#xff1a; PM2.5是指大气中…

Mybatis反射核心类Reflector

Reflector类负责对一个类进行反射解析&#xff0c;并将解析后的结果在属性中存储起来。 一个类反射解析后都有哪些属性呢&#xff1f;我们可以通过Reflector类定义的属性来查看 public class Reflector {// 要被反射解析的类private final Class<?> type;// 可读属性列…

linux系统初始化本地git,创建ssh-key

step1, 在linux系统配置你的git信息 sudo apt install -y git//step1 git config --global user.name your_name // github官网注册的用户名 git config --global user.email your_email //gitub官网注册绑定的邮箱 git config --list //可以查看刚才你的配置内容…

前端实现埋点

前端实现埋点 如何去了解用户呢&#xff1f;最直接有效的方式就是了解用户的行为&#xff0c;了解用户在网站中做了什么&#xff0c;呆了多久。而如何去实现这一操作&#xff0c;这就涉及到我们前端的埋点了。 埋点方式 什么是埋点&#xff1f; 所谓埋点是数据采集领域&…

【限时免费】20天拿下华为OD笔试之【DP/贪心】2023B-观看文艺汇演-200分【欧弟算法】全网注释最详细分类最全的华为OD真题题解

【DP/贪心】2023B-观看文艺汇演 题目描述与示例 某公园将举行多场文艺表演&#xff0c;很多演出都是同时进行&#xff0c;一个人只能同时观看一场演出&#xff0c;且不能迟到早退&#xff0c;由于演出分布在不同的演出场地&#xff0c;所以连续观看的演出最少有 15 分钟的时间…

难怪被人卷了不知道啊!这么学自动化测试,一个星期就搞定了!!!

目前自动化测试并不属于新鲜的事物&#xff0c;或者说自动化测试的各种方法论已经层出不穷&#xff0c;但是&#xff0c;能够明白自动化测试并很好落地实施的团队还不是非常多&#xff0c;我们接来下用通俗的方式来介绍自动化测试…… 首先我们从招聘岗位需求说起。看近期的职…

[论文阅读]CBAM——代码实现和讲解

CBAM 论文网址&#xff1a;CBAM 论文代码&#xff1a;CBAM 本文提出了一种卷积块注意力模块&#xff08;CBAM&#xff09;&#xff0c;它是卷积神经网络&#xff08;CNN&#xff09;的一种轻量级、高效的注意力模块。该模块沿着通道和空间两个独立维度依次推导注意力图&#x…

探索深度学习:从理论到实践的全面指南

探索深度学习&#xff1a;从理论到实践的全面指南 摘要&#xff1a; 本文旨在提供一个关于深度学习的全面指南&#xff0c;带领读者从理论基础到实践应用全方位了解这一技术。我们将介绍深度学习的历史、基本原理、常用算法和应用场景&#xff0c;并通过Python代码示例和Tens…

Grafana采用Nginx反向代理

一、场景介绍 在常规操作中&#xff0c;一般情况下不会放开许多端口给外部访问&#xff0c;特别是直接 ip:port 的方式开放访问。但是 Grafana 的请求方式在默认情况下是没有任何规律可寻的。 为了满足业务需求&#xff08;后续通过 Nginx 统一一个接口暴露 N 个服务&#xf…

WordPress最廉价优化整站的加载速度

为什么说一个站不优化就等于一个人做整个团队的事务导致项目进展慢&#xff0c;网站也是如此 图片、静态文件、php分离加速&#xff0c;加载速度并不是很快但是很协调比单个网站加载速度快许多 一、图片单域名加载设置上传文件路径和域名 以下代码添加在主题目录&#xff1a;fu…

PyQt6实战开发之旅-代码均可运行

学习感悟 由于官方文档是英文的&#xff0c;所以学习起来不是很直观。网上的中文教程也都有点偏重就轻&#xff0c;去从头学习细枝末节不是很必要。假如每个控件组件讲十分钟&#xff0c;几百个控件可想而知。最关键的是有python基础&#xff0c;能理解类与继承&#xff0c;函…

leetcode9.回文数

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

基于STC12C5A60S2系列1T 8051单片按页写IIC总线器件24C02并显示在液晶显示器LCD1602上应用

基于STC12C5A60S2系列1T 8051单片机按页写IIC总线器件24C02并显示在液晶显示器LCD1602上应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍…

开通橱窗还能开抖店吗?怎么开通?一篇详解!

我是电商珠珠 开通商品橱窗之后还能开抖店吗&#xff1f;商品橱窗和抖音小店可以同时开吗&#xff1f; 一部分人最初的时候&#xff0c;都觉得直播带货很火&#xff0c;所以就自己去买粉丝或是发视频积攒粉丝&#xff0c;等粉丝够了发现&#xff0c;好像和当初想的不太一样&a…

docker (简介、dcoker详细安装步骤)- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应…

Java基于springboot+vue开发服装商城小程序

演示视频&#xff1a; 小程序 https://www.bilibili.com/video/BV1rM411o7m4/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 管理员 https://www.bilibili.com/video/BV1fc411D7V3/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae…

【Python爬虫实战项目】ip代理池项目原理及代码解析

视频讲解链接&#xff1a;https://www.bilibili.com/video/BV1e8411r7xX/ 代码链接&#xff1a;https://github.com/w-x-x-w/Spider-Project 大家好&#xff0c;这一季我们来介绍一个Python爬虫实战项目-ip代理池项目&#xff0c;这一集我们会首先介绍ip代理池的工作原理流程&a…

一文讲明SpringMVC 【爆肝整理一万五千字】

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 ✈️已经旅游的地点 | 新疆-乌鲁木齐、新疆-吐鲁番、广东-广州…