C语言指针强制类型转换(这个明天看!)

【数据存储】指针强制转换 void指针又名万能指针,在现在的很多程序中,当参数不确定时就用万能指针代替,这一类的指针在线程\进程函数里特别常见。ANSIC规定,void指针可以复制给其他任意类型的指针,其他任意类型的指针也可以复制给void指针,指针是一个存储数据地址空间的变量,指针在工作时可以根据指针类型确定数据的字节大小,根据指针变量中存储的地址空间提取数据。p1存储的地址为a的低地址空间,char类型占1个字节,所以只读取1025的低四位。指针类型的p1可以直接打印指针指向的值,而void。... 阅读详情

概要:

C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。

例如,定义如下:

int a;

 float b;

double c;

 long double d;

(假设它们所占的字节分别是4、8、8、10,而且连续存储于某个地址空间,起始地址是100,则我们可以得到如下内存分布)

a变量就是由以地址100开始到103结束的4个字节内存空间内的0-1代码组成。b变量则是由以地址104开始到112结束的8个字节内存空间内的0-1代码组成。而在机器中,这些内存都是连续的0-1代码,机器并不知道100~103是整型而104~111是float型,所有这些类型都是编译器告知的。当我们用a时,由于前面把a定义为int型,则编译器知道从a的地址开始向后取4个字节再把它解释成int型。那么(float)a,就是先按照int类型取出该数值,再将该数值按照int to float的规则转换成float型。所以强制类型转换就是按照某个变量的类型取出该变量的值,再按照***to***的规则进行强制转转换。如果是(类型名)常数,则是将该常数按照常数to类型 的规则进行强制转换。

指针也是一个变量,它自己占据一个4个字节的地址空间(由于程序的寻址空间是2^32次方,即4GB,所以用4个字节表示指针就已经能指向任何程序能够寻址到的空间了,所以指针的大小为4字节),他的值是另一个东西的地址,这个东西可以是普通变量,结构体,还可以是个函数等等。由于,指针的大小是4字节,所以,我们可以将指针强制转换成int型或者其他类型。同样,我们也可以将任何一个常数转换成int型再赋值给指针。所有的指针所占的空间大小都是4字节,他们只是声明的类型不同,他们的值都是地址指向某个东西,他们对于机器来说没有本质差别,他们之间可以进行强制类型转换。
指针 to 指针的强制类型转换是指将指针所指的内容的类型由原先的类型转换为后面的类型。

int a = 1;

int *p = &a;

float *p1 = (float*)p;

则p和p1的值都是&a,但是*p是将&a地址中的值按照int型变量进行解释,而*p1则是将&a地址中的值按照float型变量进行解释。


鉴于指针之间这种灵活的强制类型转换的需求和出于简化代码的考虑,ANSI C引入了空指针即void*。void指针又名万能指针,在现在的很多程序中,当参数不确定时就用万能指针代替,这一类的指针在线程\进程函数里特别常见。

ANSI C规定,void指针可以复制给其他任意类型的指针,其他任意类型的指针也可以复制给void指针,他们之间复制不需要强制类型转换。当然任何地址也可以复制给void型指针。我们在《网络编程》中经常会看到accept(socket, (struct sockaddr *)&saddr_c, &lenth)之类的语句在&saddr_c之前需要增加代码(struct sockaddr *)是因为当此函数被设计的时候ANSI C还没有提出void*的概念。所有的地址统一用struct sockaddr类型标识,该函数的第二个参数也是指向struct sockaddr类型的指针,此处是强制类型转换。

当然,在某些编译器中不同类型的指针也可以进行直接赋值,但一般情况下会给出类型不匹配的警告。要求程序员显示的给出指针强制类型转换可以提醒程序员小心使用指针,对于明确程序目的具有一定的好处。

1、指针类型强制转换:

int m;

int *pm = &m;

char *cp = (char *)&m;

pm指向一个整型,cp指向整型数的第一个字节


2、结构体之间的强制转换

struct str1 a;

struct str2 b;

a=(struct str1) b;                  //this is wrong

a=*((struct str1*)&b);         //this is correct


3、关于一个程序的解释


int main(void)

{

    int a[4] = {1, 2, 3, 4};

    int *ptr1=(int *)(&a+1);

    int *ptr2=(int *)((int)a+1);

    int *c = *(a + 1);

    printf("%x, %x,%x\n", ptr1[-1], *ptr2,*c);

    return 0;

}

输出分别为4 和2000000,2

式子&a+1表示的是指针加法运算,而不是普通的数值加法运算

vs2008下,其中a = 0x001bfc18
(&a + 1) = 0x001bfc28
而 a+1 = 0x001bfc1c

 &a + 1 的值取决于a的类型如果a申明int a;
则&a + 1 = 0xFFFF5704  = a + 1
如果 int a(ArryLen);
则&a + 1 = 0xFFFF5700 + 4 * ArryLen <> a + 1

a 表示数组的起始地址,(int ) a 表示将a的地址转化为一个整形数,(int)a + 1 表示普通的数值加法运算,(int *)((int)a + 1)表示把(int )a + 1转化为整型指针的地址。该地址指向数组a(0)的第一个字节(从0计数),因为是int型的 所以需要四个字节的解释,所以结果是a(0)的后三个字节和a(1)的第一个字节组成的值,该值受大小端的影响。

 *(a + 1)  此时的a已经是一个常指针了,这个表达式计算出a所指向元素后面的第2个元素的地址,然后对它解引用得到相应的值。这个表达式等价于

int last = a[1]

将指针对象转化为整形传递并读取 DWORD ia =10;//定义了一个整形变量 LPVOID lp =(LPVOID) &ia;//取ia地址,然后转为指针 cout << lp << endl;//看看lp是什么 //cout << *lp << endl;//错误,不能直接从LPVOID指针类型中取值 //cout << (DWORD)(*lp)<< endl; cout << *(DWORD*)lp &... 阅读详情

相关推荐

嵌入式C语言开发中面向对象设计思想的应用与实践

面向对象编程(OOP)是一种通过封装、继承和多态来组织代码的设计范式,其核心在于将数据与操作数据的方法捆绑为对象,以提升代码的模块化和复用性。在嵌入式系统开发中,随着项目复杂度从简单的单片机控制演进到多模块协同的实时操作系统(RTOS)应用,传统的面向过程编码方式常面临模块耦合高、维护困难等挑战。此时,引入面向对象思想,即便在原生不支持OOP的C语言中,也能通过结构体封装数据、函数指针模拟多态等技巧,构建出高内聚、低耦合的硬件抽象层(HAL)和驱动框架。这种设计显著提升了代码的可维护性、可测试性和跨平台复用

332

C语言指针强制类型转换

概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。 例如,定义如下: int a;  float b;

mhjcumt的专栏 14万+

RT-Thread C语言多态实现:嵌入式开发中的面向接口编程实践

在嵌入式系统开发中,面向对象编程(OOP)和设计模式是提升代码复用性和可维护性的重要概念。其核心原理是通过抽象接口定义行为规范,利用函数指针和结构体在C语言中模拟多态机制,实现运行时动态绑定。这种技术的核心价值在于解耦模块间的依赖关系,增强系统的可扩展性和可测试性。在嵌入式实时操作系统(RTOS)如RT-Thread中,该技术被广泛应用于设备驱动框架、虚拟文件系统(DFS)等关键场景,通过统一的设备操作接口(如rt_device_read/write)和驱动模型,使得上层应用无需关心底层硬件细节,显著提升了

weixin_33769125的博客 393

C++指针和指针类型强制转换

指针变量的本质:指针变量,本质上是一个变量,只是它是存放地址的变量,指针的类型代表的是它所指向的变量的类型。因此就有了指向整型、字符型、浮点型等其它类型的指针,但实际上所有类型的指针变量存放的都是int型(对于16位编译系统,int是2字节,对于32位编译系统,int是4字节)的地址。注意和指针指向对象的类型区分开),指针变量所存储的地址为指针所指向的对象的首地址。指针 to 指针的强制类型转换是指,将指针所指的内容的类型由原先的类型转换为后面的类型:即进行变量解释的时候,解释类型的转换。

js_hfut的博客 2631

【C语言】字符串的输入和输出(使用C标准库函数 gets() 和 puts() )(附 字符指针实现)| C语言面试题目:请解释一下C语言中的指针数组和数组指针的区别和使用场景。

案例 使用gets(),从键盘输入一个带空格的人名,然后把它显示在屏幕上。 #include <stdio.h> #define N 15 int main(){ char name[N]; printf("Enter your name:"); gets(name); printf("Hello %s!\n",name); puts(name); } 测试输出 相比printf(),puts()不好的一点就在于不能控制输出格式。 函数puts()用于从括号内的参数给出的

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 4101

从零构建XVC协议栈:FPGA+W5300的跨界调试架构实战

本文详细介绍了如何从零构建XVC协议栈,通过FPGA与W5300以太网控制器的创新组合实现跨界调试架构。重点解析了JTAG时序逆向、TCP/IP协议栈集成与XVC协议实现,提供了硬件设计优化和性能加速技术,为嵌入式开发者和FPGA工程师提供实用的远程调试解决方案。

raspberrypi5的博客 247

C---int和指针转换注意事项

这个标题也许写的有点不知所以然了,其实博主今天要讨论的自己在复习c/c++指针和引用的时候遇到的一些问题,慢慢说来….. 开始的时候写了这么一段代码: int a = 1; int* p = &a; printf("指针变量p的值 p - 16表示 是 = %p \n",p); printf("a的地址 p - 16表示 是 = %p \n",&a); /*输出 指针变量p

tingyun_say的博客 2万+

VScode搭建Opencv(C++开发环境)

VScode配置Opencv一、准备软件二 、下载软件1、MinGw下载2、 Cmake下载3、Opencv下载三、编译1、cmake-gui2、make3、install四、 VScode配置1、launch.json2、c_cpp_properties.json3、tasks.json五、测试 用了半天事件,看了各种的博客终于配置成功了,在这里记录并分享一下,让更多的人少走弯路。 本次环境是Win 10. 一、准备软件 我们本次用到的3个软件,(建议读者文件路径,文件版本 尽量都和我相同,这样不容易出错

河旬的博客 8万+

初次见面——C语言的整体把握【小白福音】

写作记录点滴,笔者讲以实时学习内容为基础,总结整理,做成对大家有用的东西。 初次见面 C语言第一步:简单的系统学习来让我们看懂代码 文章目录初次见面前言一、程序猿的第一份见面礼二、与实际生活联系,各种各样的数据类型1.类型介绍2.类型解读三、常量与变量1.变量变量的定义方法变量的分类变量的使用变量的作用域与生命周期2.常量字面常量const 修饰的长变量#define的标识符常量枚举常量四,字符串,转义字符,注释字符串转义字符注释选择语句循环结构while函数总结 前言 刚开始写博客,不管是立意还是排版

qq_62852431的博客 7123

学习STM32的流体水位传感器

引言: 流体水位传感器是一种常用于测量液体水位的设备,广泛应用于水位监测、液位控制和流量计量等领域。STM32是一款功能强大的单片机,具有丰富的外设和灵活的编程能力,非常适合用于流体水位传感器的开发。本文将介绍如何使用STM32开发板与流体水位传感器进行连接和通信,并通过编写代码实现水位的测量和显示。五、总结: 通过以上的代码示例,我们可以实现使用STM32开发板与流体水位传感器进行连接和通信的功能。三、编写代码: 以下是使用STM32CubeIDE编写的示例代码,实现了读取流体水位传感器的功能。

xiaoalla的博客 739

进阶篇第8节:寄存器压力——寄存器溢出对性能的影响及优化

**摘要:GPU寄存器是最快的存储单元(1周期访问),但数量有限。过高的寄存器使用会导致溢出(变量存入慢速本地内存)或降低占用率(减少并发线程数),严重影响性能。优化方法包括复用变量、使用共享内存替代寄存器数组、限制寄存器数量(--maxrregcount)等。实际测试显示,将寄存器使用从48个降至24个可使性能提升37%。分析工具如Nsight Compute可帮助检测寄存器压力。面试常见问题涉及寄存器溢出的检测与优化策略。

PeterPan的博客 94

C语言:两条函数指针代码解析

两条函数指针代码解析前言代码一代码二总结 前言   函数指针类型看起来十分的繁琐复杂,但按照规律去查看就会发现其中一些共同点,并理解其中的用意,下面两条代码同样是课上学到的,我记录下来并对其进行拆分理解,不妥的地方,欢迎大家指点评论啊! 代码一 代码如下: (* (void (* ) ()) 0)(); //代码解析 // void (* ) () //*确定其类型为指针,声明符为void类型的函数 //因而上式表达的含义为:指向返回值为void类型的函数的指针 //将其放..

weixin_42269028的博客 164

C#串口通信革命:RJCP.DLL.SerialPortStream实战全解析

本文介绍了如何通过RJCP.DLL.SerialPortStream库实现高性能串口通信解决方案。相比.NET自带的SerialPort类,该库提供了完全的异步非阻塞IO、动态缓冲区控制和多线程事件驱动等优势,特别适合工业自动化和物联网场景。文章详细讲解了环境搭建、核心功能对比,并通过代码示例展示了端口配置、异步通信管道搭建等关键技术。最后以Modbus RTU协议为例,演示了高级协议封装方法,为开发者提供了完整的工业级串口通信实现方案。

墨夶的博客 1868

指针进阶版☞(超easy~)

指针详解,来看看吧(^U^)ノ~YO (●'◡'●)

pingwenqi的博客 941

从 VS Code 登录 ABAP Destination,一次把前后端连接跑通

最近很多 ABAP 开发者开始把 VS Code 纳入日常开发环境,原因很直接,VS Code 的轻量体验、命令面板、文件树、插件生态和 AI 编程能力,已经深深影响了现代开发者的工作方式。SAP 官方发布的 ABAP Development Tools for VS Code,也把 ABAP Cloud 开发模型带进了这个编辑器里。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 221

IDM 的免费替代品来了!这款开源下载器速度提升500%

💡分享一款开源的下载管理工具,支持多线程加速(最高提升500%)、队列管理、计划任务和浏览器集成,界面现代化且支持深色模式,跨平台支持Windows/Linux,是IDM的优秀替代方案🎈

XiaoqiangClub的博客 727

C语言初步及其语法

define _CRT_SECURE_NO_WARNINGS 1,不然的话会出现不安全报错,vs自带scanf_s可解决这个问题,但是会失去代码的可移植性并且内里意义与scanf有所不同,会报告不安全原因在于scanf函数可以输入超出其开始规定存储字节的内容,导致多余内容冲毁周边内存,造成程序崩溃,但是目前没有遇到这种情况。scanf() 必须提前知道用户输入的数据类型,才能处理数据,它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量,如果只想输出开头的部分,可以⽤。

inrichtt的博客 186

[网络安全提高篇] 一二九.Powershell恶意代码检测 (5)混淆和反混淆 [上]

前文介绍了如何利用MS Defender实现恶意样本家族批量标注。这篇文章将继续讲解Powershell恶意代码检测,主要包括PowerShell混淆与反混淆内容,首先结合Invoke-Obfuscation工具详细介绍PowerShell代码混淆方法,再结合PowerDecode工具阐述解混淆方法。该研究将为后续的恶意软件家族分类或溯源提供帮助。未完待续,基础性文章,希望您喜欢,且看且珍惜。

杨秀璋的专栏 1535

第五天:全国计算机等级考试C语言专题

今天是释然发题解的第五天,以后每一天都会和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣。 本文约10000字,预计阅读40分钟 昨天我们学习了链表,忘记的小伙伴们可以看一下哦: 初识链表 今天我们来聊一聊全国计算机等级考试C语言专题的相关内容,明天和大家分享链表的相关题目: 全国计算机等级考试介绍:核心知识顺序结构选择结构循环结构字符型数据 位运算函数指针:学好指针非常地...

释然的成长之路 812

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C语言(数据类型)

编程语言中的数据类型,那是一个刚开始接触代码的初学者会学习的第一个概念,但是我们对这个概念真的理解彻底吗?我看不一定。 请看下面这段会被实验室大神,或者技术装逼犯看不起的定义语句: int sum; 也难怪,这么简单的定义语句,实在没什么好讲的,即便是对一个零基础小白,解释完这条语句也是三言两语的事儿,不信你听听:“定义了一

林世霖的技术博客 777

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

算法笔记刷题日记——2.C_C++在ACM中的常用语法

这学期选了ACM课,但平时缺乏练习,不怎么刷题,因此期末考试成绩并不理想。考虑到之后的考研复试中包含机试,且计试可以算是非常重要的印象分,因此我打算寒假刷一下算法笔记,备战3月初的PAT甲级和3月末的CCF CSP认证考试,为后续考研复习数据结构等也算是打下一个良好的基础。1.int a,b=-1是正确的语法。

wawa_is_studying的博客 971

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C语言学习笔记11-结构体(struct、结构作为函数参数、结构数组)、联合体/共用体typedef; union(大、小端序)

声明在函数内/外的规则和本地变量一样一般在函数外声明结构类型,这样可以被多个函数使用。声明好后,千万别忘记{}后加上;。声明结构体的形式(可以在struct前加typedef关键字重定义类型)并定义可以使用的变量 —— 3种方式t1和t2都是time结构类型的变量:同时做了声明和定义(main并列 全局):如下,t1和t2是无名结构变量(程序只需要用到少量确定的结构变量)结构变量的初始化集成初始化只能在定义时同步做,定义好后不支持这样初始化了,但可以强制类型转换重新赋值。

m0_52526498的博客 981

动态内存(c)

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针,注意并不是每次开辟空间都会成功,如果成功就返回一个开辟好空间的指针,失败则会返回一个空指针,因此使用malloc时一定要对它的返回值做检查。大家好,今天我们就来聊聊c语言中动态内存的一些知识,相信大家很多时候在申请空间时总会有空间不够用或者太大用不完的情况吧,这个时候使用动态内存就是一个不错的选择,下面我们便来了解一下。这个函数就是用于释放空间的,参数为我们申请空间的那个指针(释放后最好将指针置为空指针避免成为空指针)。1.malloc函数。

2403_86949771的博客 648

2021-07-13:C++基础知识02

C++基础知识02 Section01:const关键字与增强 Subsection-1.1:C语言中的const关键字 先来看一个例子,思考一下C语言中的const关键字是否能起到作用,示例: #include <stdio.h> int main() { const int i1 = 10; int* pi1 = (int*)&i1; *pi1 = 20; printf("%d\n", i1); return 0; } 输出结果是: 20

qq_44274276的博客 259

c语言实现线性动态,C语言实现线性结构创建动态链表的学习心得(一)

/*处理动态链表所需要的函数1、malloc函数原型为: void *malloc(unsigned int size);其作用是在动态存储区中分配一个长度为size的连续空间。此函数返回值是一个指向分配域起始地址的指针(基类型为void).如果此函数未能分配成功地执行(例如内存空间不足)则返回空指针(NULL).void型是指(void指针型类型,可定义一个指针变量,但不指定它是指向哪一种类型数...

weixin_29224589的博客 193

C语言进阶:构造数据类型与底层操作全解析 构造数据类型篇(下) 联合体 枚举 typedef 位运算和内存管理

想象你有一个“万能收纳盒”:它的大小刚好能装下最大的物品,但同一时间只能装一种东西。这就是联合体的本质——所有成员共享同一块内存空间,修改其中一个成员会影响其他成员的值。和结构体的区别?结构体是“分房间住”(每个成员独立内存),联合体是“挤一间房”(共享内存)。union 共用体名数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;union 共用体 变量名;enum 类型名枚举常量1;//里面没有类型,都是int枚举常量2;//枚举常量的值都是int枚举常量3;

2302_80623234的博客 1393
上一篇: 特征值和特征向量
下一篇: struct和typedef struct
PengPengBlog
博客等级 码龄10年 178粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值