2023-4-27-深入理解C++指针类型间强制转换



🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

在编程的过程中遇到了很深入的指针之间转换操作,指针的位操作,让我很蒙,这篇文章系统深入的学习一下C++指针类型之间的强制转换,直到学明白为止。
学习后的成果:

char *a="asdasd";
double b= *(double *)&a[0];

这段代码虽然只有两句,但并不简单,第一行声明一个char *指针,第二行的意思是

  • a[0] 该字符串第一个元素

  • &a[0] 该字符串第一个元素的地址,这里相当于char * x = &a[0]

  • (double ) &a[0] 将该char指针转换为double *指针 ,相当于double y=(double ) x;
    转换前指针是char
    类型,编译器会找到指针所指向的地址,并每一次取一个字节(char类型元素的大小)将取出来的值按照char类型读取出来;转换后指针是double
    类型,编译器会找到指针所指向的地址,并每一次取八个字节(double类型元素的大小)将取出来的值按照double类型读取出来

  • *(double *)&a[0] 也就是上面所说,取八个字节(double类型元素的大小)将取出来的值按照double类型读取出来


目录

  • 🍬本文摘要
  • 😉一、不同操作系统的基础类型大小
  • 🐱‍🐉二、内存中的地址
  • 🎉三、内存中的地址没有明确数据类型,但地址值有类型
  • 🐱‍🚀四、强制转换的原理
  • 🎂五、char*的打印问题!
  • 🥩六、交作业
  • 🧊文章总结



😉一、不同操作系统的基础类型大小

基础类型32位64位
bool11
char11
unsigned char11
short int22
int44
指针48
unsigned int44
float44
long44
unsigned long44
double88
long long88

🐱‍🐉二、内存中的地址

地址的本质就是一串01机器代码
内存中的地址没有明确数据类型,但地址值有类型
无论什么类型的指针变量,在内存中本质都是一样的,是一个整数值的地址值。


🎉三、内存中的地址没有明确数据类型,但地址值有类型

int *a;

指针变量,本质上是一个变量,只是它是存放地址的变量,指针的类型代表的是它所指向的变量的类型。因此就有了指向整型、字符型、浮点型等其它类型的指针,但实际上所有类型的指针变量存放的都是int型(某一个地址)。

上述代码表示指向整型的指针变量a,其中a表示一个地址值,上面曾提到地址没有明确的数据类型,因为地址可以为指向整型的指针,可以为指向浮点型的指针。指针类型为整型,表示当我们对该地址进行访问(解引用)时,编译器会将它解释为整型。

注意:指针地址只指向数据存储的内存的位置,具体变量的类型由编译器告知。


🐱‍🚀四、强制转换的原理

(1)普通变量强转
  (float)a,就是先按照int类型取出该数值,再将该数值按照int to float的规则转换成float型,如果反过来,则会发生数据截断。
(2)指针变量强转
  旧指针 to 新指针的强制类型转换是指将指针所指的内容的类型由原先的类型转换为后面的类型:即进行变量解释的时候,解释的类型变化。
  如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP和TYPE,那么语法格式是:(TYPE)p;这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE*,它指向的类型是TYPE,(也就是说,新指针指向的数据将会用TYPE类型进行解释,如果之前是浮点型数据-3.75,先将其转换为二进制代码,然后转化为TYPE类型存储),它指向的地址就是原指针指向的地址。


🎂五、char*的打印问题!

1.如果给cout提供一个指针,它将打印指针所指向的地址单元的地址,但如果指针类型为char *,则cout将打印char *指针所指向的字符串。
2.如果要显示char *指针所指向的地址单元的地址,需要将char *类型的指针强制转化为另一种类型的指针,我将char *类型的指针强制转化为int *类型指针。

#include "iostream"
#include "regex"

using namespace std;

int main() {
    char  *lpUnitPara = "2111111111111";//lpUnitPara指向字符串的首地址

    std::cout << *lpUnitPara << std::endl;// 2 打印首地址的值
    std::cout << lpUnitPara[0] << std::endl;// 2 打印第一个元素的值
    std::cout << lpUnitPara[1] << std::endl;// 1 打印第二个元素的值
    std::cout << &lpUnitPara<< std::endl; //000000061B10F738 打印的是lpUnitPara指针的地址
    std::cout << lpUnitPara<< std::endl;//2111111111111 lpUnitPara是字符串的首地址,cout会直接打印lpUnitPara指向的字符串
    std::cout << &(lpUnitPara[0]) << std::endl;//2111111111111 lpUnitPara[0]是字符串第一个元素的值,加上&变成了一个char*指针指向第一个元素地址,cout会直接打印该地址指向的字符串
    std::cout << &(lpUnitPara[1]) << std::endl;//111111111111 lpUnitPara[1]是字符串第二个元素的值,加上&变成了一个char*指针指向第二个元素地址,cout会直接打印该地址指向的字符串
    return 0;
}

🥩六、交作业

char *a="asdasd";
double b= *(double *)&a[0];

这段代码虽然只有两句,但并不简单,第一行声明一个char *指针,第二行的意思是

  • a[0] 该字符串第一个元素

  • &a[0] 该字符串第一个元素的地址,这里相当于char * x = &a[0]

  • (double ) &a[0] 将该char指针转换为double *指针 ,相当于double y=(double ) x;
    转换前指针是char
    类型,编译器会找到指针所指向的地址,并每一次取一个字节(char类型元素的大小)将取出来的值按照char类型读取出来;转换后指针是double
    类型,编译器会找到指针所指向的地址,并每一次取八个字节(double类型元素的大小)将取出来的值按照double类型读取出来

  • *(double *)&a[0] 也就是上面所说,取八个字节(double类型元素的大小)将取出来的值按照double类型读取出来


🧊文章总结

提示:这里对文章进行总结:

  大彻大悟






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

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

相关文章

记一次峰回路转的注入

0X01 背景 自己之前写过一篇记录&#xff0c;当时是由于之前是一位校友刚做开发&#xff0c;叫我友情帮忙测试一波&#xff0c;由于是开发的新手&#xff0c;漏洞比较多&#xff0c;所以直接从注入开始讲起&#xff0c;但是到getshell的过程也算是一场峰回路转再跌跌撞撞的路程…

【Java笔试强训 17】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;杨辉三角…

洞见数字时代的创新原力,数云原力大会暨2023TECH第五届数字中国技术年会开幕

4月25日&#xff0c;神州控股、神州信息、神州数码集团共同主办的数云原力大会暨2023TECH第五届数字中国技术年会开幕。开幕式上&#xff0c;数百位投身并关注数字技术、数字产业发展的学者、技术专家、从业者、行业用户齐聚一堂&#xff0c;围绕云原生、数字原生、大数据、金融…

这一次,让Kotlin Flow 操作符真正好用起来

前言 Kotlin Flow 如此受欢迎大部分归功于其丰富、简洁的操作符&#xff0c;巧妙使用Flow操作符可以大大简化我们的程序结构&#xff0c;提升可读性与可维护性。 然而&#xff0c;虽然好用&#xff0c;但有些操作符不太好理解&#xff0c;可惜的是网上大部分文章只是简单介绍其…

吴恩达 Chatgpt prompt 工程--1.Guidelines

课程链接 Setup #安装 !pip install openai#设置key !export OPENAI_API_KEYsk-... # or #import openai #openai.api_key "sk-..."import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv())openai.api_key os.geten…

记一次SSRF漏洞的学习和利用

导语&#xff1a;本文主要记录一次我们在复盘嘶吼网站渗透报告时遇到的一个SSRF漏洞。 1.前言 本文主要记录一次我们在复盘嘶吼网站渗透报告时遇到的一个SSRF漏洞。此漏洞并结合腾讯云的API接口&#xff0c;可以获取大量嘶吼服务器的敏感信息。利用这些敏感信息&#xff0c;又…

android10 关闭默认输入法的“更正建议”

1. 场景 使用系统默认的输入法&#xff0c;在进行输入时&#xff0c;在输入法上方&#xff0c;会显示更正建议列表&#xff0c;同时会干扰我们的输入内容&#xff1a;会自动补全到输入框&#xff0c;而且删除不掉&#xff0c;甚至越删越多&#xff0c;非常讨厌。 如下&#x…

一段凄惨Android 面试经历分享,败在了项目架构原理上……

大家应该看过很多分享面试成功的经验&#xff0c;但根据幸存者偏差的理论&#xff0c;也许多看看别人面试失败在哪里&#xff0c;对自己才更有帮助。 这是一位网友分享的面试经历&#xff0c;他准备了3个月&#xff0c;刚刚参加完字节跳动的第三面&#xff0c;视频面&#xff…

都23年了你还记得渐进式框架是什么意思吗

vue 文章目录 vue前言一、眼见为实举个栗子二、渐进式的优势 前言 渐进式框架是一种能够逐步增强应用功能的框架&#xff0c;它允许开发者在不影响应用性能的情况下&#xff0c;逐步添加新的功能和特性。Vue.js提供了一些基础功能&#xff0c;如数据绑定和组件化&#xff0c;然…

这8个摸鱼神器,千万别让你老板知道!

工欲善其事&#xff0c;必先利其器&#xff0c;对于程序员来说也是如此&#xff0c;想早点下班就不能死脑筋&#xff0c;必须借助于一些开发工具来提高自己的工作效率&#xff0c;小编选取了8款任务/项目管理工具&#xff0c;能助你[打通任督二脉]&#xff0c;工作效率大大提升…

React之动态路由创建以及解决刷新白屏问题

动态路由的创建和动态菜单的创建几乎类似&#xff0c;只不过的是&#xff0c;动态路由需要导入组件。这样才能完成跳转。 动态路由与动态菜单一样都需要封装一个转化函数&#xff0c;将后端传来的数据进行转换&#xff0c;转换成我们需要的格式。 需要导入的依赖 导入路由use…

【ChatGPT】阿里版 ChatGPT 突然官宣意味着什么?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 阿里版 ChatGPT 突然官宣 ​ ChatGPT 技术在 AI 领域的重要性 自然语言生成 上下文连续性 多语言支持 ChatGPT 未来可能的应用场景 社交领域 商业领域 ​编辑 医疗领域…

网络安全常用术语

肉鸡 肉鸡指的就是被黑客成功入侵并取得控制权限的电脑。黑客们可以随意的控制肉鸡&#xff0c;就像在使用自己的电脑一样&#xff0c;很形象的比喻&#xff0c;就像是养的肉鸡&#xff0c;任黑客宰杀和利用。关键的是&#xff0c;在成为肉鸡后&#xff0c;只要黑客不对电脑进…

linux|进程间通信如何加锁

进程间通信有一种[共享内存]方式&#xff0c;大家有没有想过&#xff0c;这种通信方式中如何解决数据竞争问题&#xff1f;我们可能自然而然的就会想到用锁。但我们平时使用的锁都是用于解决线程间数据竞争问题&#xff0c;貌似没有看到过它用在进程中&#xff0c;那怎么办&…

Java——把数组排成最小的数

题目链接 牛客网在线oj题——把数组排成最小的数 题目描述 输入一个非负整数数组numbers&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。 例如输入数组[3&#xff0c;32&#xff0c;321]&#xff0c;则打印出这三个数字能…

如何提高三维模型OSGB格式转换3DTILES的转换速度和数据质量

如何提高三维模型OSGB格式转换3DTILES的转换速度和数据质量 提高三维模型从OSGB格式转换为3DTILES格式的转换速度和数据质量&#xff0c;可以从以下几个方面进行优化&#xff1a; 1、选用高效的转换工具&#xff1a;选择高效的转换工具是提高转换速度和数据质量的关键。目前市…

【react从入门到精通】深入理解React生命周期

文章目录 前言React技能树React的生命周期是什么React v16.0前的生命周期组件初始化(initialization)阶段组件挂载(Mounting)阶段组件更新(update)阶段组件销毁阶段 React v16.4 的生命周期总结写在最后 前言 在上一篇文章《react入门这一篇就够了》中我们已经掌握了React的基本…

ABTEST平台建设思路与方案

导读 ABTest的作用&#xff1a; 用ABTEST的结果数据&#xff0c;论证是因为某个业务方案的调整&#xff0c;对产品能力的影响。ABTEST是一个过程&#xff0c;只是为了证明改动的效果&#xff0c;其最终的阶段一定是对某个方案进行推全结束实验&#xff0c;避免稳定的业务流程…

docker 安装 datax和datax-web 之 datax-web登录时提示账号或密码错误

docker 安装docker 安装 datax和datax-web 安装教程地址&#xff1a; https://www.cnblogs.com/leihongnu/p/16612273.html 根据该博客的教程安装成功后&#xff0c;登录页面能打开&#xff0c;但是所提供的账户密码一直报错&#xff0c;这个就需要根据日志一步步去寻找原因了…

管理后台项目-07-菜单管理和动态展示菜单和按钮

目录 1-菜单管理 1.1-菜单管理列表 1.2-添加|修改功能 1.3-删除菜单 2-动态菜单按钮展示 2.1-路由文件的整理 2.2-动态展示不同的路由 1-菜单管理 当用户点击菜单管理的时候&#xff0c;会展示当前所有菜单&#xff0c;树型结构展示...并且可以对菜单进行新增编辑删除操…