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

news2025/1/23 17:48:10


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

💥💥💥欢迎来到🤞汤姆🤞的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
下一篇

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

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

相关文章

【致敬未来的攻城狮计划】— 连续打卡第十四天:FSP固件库开发延时函数(时钟详解)

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

数据结构_线性表、顺序表、单链表

目录 1. 线性表的定义和基本操作 1.1 线性表的定义 1.2 线性表的特点 1.3 线性表的基本操作 2. 线性表的顺序表示 2.1 顺序表的定义 2.2 顺序表上基本操作的实现 2.2.1 插入操作 2.2.2 删除操作 2.2.3 按值查找 2.3 相关练习巩固 3. 线性表的链式表示 3.1 单链表的…

Zynq-7000、FMQL45T900的GPIO控制(五)---linux应用层配置GPIO输出控制

上文中详细阐述了对应原理图MIO/EMIO的编号&#xff0c;怎么计算获取linux下gpio的编号 本文涉及C代码上传&#xff0c;下载地址 Zynq-7000、FMQL45T900的GPIO控制c语言代码资源-CSDN文库 本文详细记录一下针对获取到gpio的编号&#xff0c;进行配置输出模式&#xff0c;并进…

RobotFramework——创建项目

创建项目 实际上在Robot Framework中创建测试项目和创建单元测试项目是一致的。 robotunittest(python)Test ProjectTest ProjectTest SuitTest SuitTest CaseTest Case 1、创建测试项目 选择菜单栏 file —> New Project Name输入"TestRobot01"&#xff1b;…

从奈奎斯特采样定理推导FMCW雷达系统性能参数

本文编辑&#xff1a;调皮哥的小助理 上文从FMCW毫米波雷达系统的性能参数理解4D成像毫米波雷达的设计思路&#xff0c;谈到关于设计4D毫米波成像雷达的思路&#xff0c;其实我还忽略了一点&#xff0c;在这里补充说明一下。 在文中谈到的最小化公式中&#xff0c;分母的有效带…

vscode - 配置Prettier插件和.editorconfig文件使用介绍

文章目录 1&#xff0c;介绍2&#xff0c;Prettier插件安装3&#xff0c;全局配置&#xff08;settings.json&#xff09;4&#xff0c;局部配置&#xff08;新建.prettierrc文件&#xff09;5&#xff0c;Prettier格式化优先级&#xff08;重要&#xff09;6&#xff0c;使用p…

【教程分享】一键部署MySQL,轻松搞定Docker安装和配置!

1 下载 MySQL 我们就可以到 docker hub 来看&#xff1a; 点击后的页面&#xff1a; 直接执行docker pull mysql&#xff0c;会下载最新版本的 MySQL。 点击 tags&#xff0c;找到并下载经典的 MySQL5.7&#xff1a; [rootservice-monitoring ~]# docker pull mysql:5.7.42-o…

Speech and Language Processing-之N-gram语言模型

正如一句老话所说&#xff0c;预测是困难的&#xff0c;尤其是预测未来。但是&#xff0c;如何预测一些看起来容易得多的事情&#xff0c;比如某人接下来要说的几句话后面可能跟着哪个单词。 希望你们大多数人都能总结出一个很可能的词是in&#xff0c;或者可能是over&#x…

【hello Linux】进程间通信——命名管道

目录 1. 命令行的命名管道 2. 命名管道 1. 命名管道的创建 2. 命名管道的使用 Linux&#x1f337; 在上篇中我们说到&#xff0c;可以使用匿名管道完成父子进程间的通信&#xff0c;它是让子进程继承父进程&#xff0c;从而达到让两个进程看到同一份资源&#xff1b; 如果我们…

急急急!Kafka Topic 资源权限紧张怎么办?

我们都知道 Kafka 的 topic 资源比较“贵”&#xff0c;所以一般会给项目 topic 权限限制&#xff0c;按需申请。Milvus 会在建新表时自动申请 kafka topic 资源&#xff0c;这时候自动申请不到怎么办&#xff1f;手动配置 topic 要符合什么规范才能被 Milvus 使用&#xff1f;…

Vue 3 第十六章:组件五(内置组件-teleport)

文章目录 1. Teleport组件的基本用法2. Teleport组件的高级用法2.1. 禁用 Teleport2.2. 多个Teleport组件共享目标元素 1. Teleport组件的基本用法 <teleport>组件用于将组件的内容插入到指定的DOM元素中&#xff0c;而不是插入到组件自身的位置。例如&#xff0c;当我们…

improperIntegral反常积分

(https://img-blog.csdnimg.cn/e5973004aba8484a82839773ff58a390.png)

【刷题记录】leetcode215 数组中的第K个最大元素

题目链接&#xff1a;215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; 题干&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k …

cleanmymac到底好不好用?有必要买吗

CleanMyMac是一款Mac电脑清理和保护工具,其最新版本为CleanMyMac X4.13。本版本在性能和功能上有较大提高,在如今的电脑使用过程中&#xff0c;保持电脑干净整洁是一项重要的任务。而随着Mac电脑越来越受欢迎&#xff0c;Mac电脑清理软件也愈发流行。在众多的Mac电脑清理软件中…

2023年PMP证书的含金量有多高?对于企业来说有多大的价值?

这里我就说一下关于PMP证书的含金量问题 1、方便就业 众所周知年这几年就业形势严峻。但是在这种大环境下&#xff0c;PMP证书持有者就业形势依然乐观。在求职市场&#xff0c;职位需求量大且薪资可观。 这种局面的形成主要是因为企项目管理规模化发展是一种发展趋势。随着公…

【error】linux运行java的jar包报错,java.lang.UnsatisfiedLinkError

目录 linux运行串口相关的java.jar报错如下&#xff1a; java.lang.UnsatisfiedLinkError是Java中的一个错误类型&#xff0c;通常发生在调用本地&#xff08;native&#xff09;方法或使用JNI&#xff08;Java Native Interface&#xff09;时。 在Java中&#xff0c;本地…

Vue(内置指令、自定义指令)

一、内置指令 1. v-text 和插值语法的效果类似 <h2>{{name}}</h2><h2 v-text"name">此处v-text绑定的数据替换所有标签内内容</h2> //vuedata: {name: "xlf",}, 注意&#xff1a;不能识别标签数据 <h2 v-text"name2"…

立体堆叠柱图的实现

立体堆叠柱图实现的实现 实现效果示例&#xff1a; 1、技术原理 1.1、技术分析 平面上的立体柱图可以看作是由4个平行四边形拼接而成的图形&#xff0c;分别是&#xff1a; 1、顶部菱形2和3、左右矩形&#xff0c;他们两个色值相同但亮度不同&#xff0c;从而产生立体阴影…

国内也能畅玩gptchat,游玩攻略分享

看到很多人都不知道怎么玩gptchat&#xff0c;小编就不能忍了&#xff0c;其实要玩chatgpt是非常的简单的&#xff0c;完全是能免费体验chatgpt的强大的。下面我们一起来了解一下国内也能畅玩gptchat&#xff0c;游玩攻略分享。 一.Chatgpt国内为啥能玩 其实现在很多的程序都接…

人人都能升薪?深扒Android开发中的通天神器Framework

近年来&#xff0c;客户端领域的竞争日益激烈&#xff0c;很多安卓开发者抱怨内卷现象普遍存在。在这种背景下&#xff0c;开发者们面对的压力越来越大&#xff0c;很难掌握足够的技能去顺利发展。解决内卷&#xff0c;突破迷茫&#xff0c;是许多开发者面临的挑战。小米的高管…