C51指针转换

【Debug指南】Keil C51语法陷阱:解析‘unsigned‘附近的error C141及类型转换的正确姿势 本文深入解析Keil C51编译中常见的'error C141: syntax error near 'unsigned''报错,揭示其根源在于强制类型转换的语法错误。文章详细讲解了C语言显式类型转换的正确格式'(unsigned char)',并探讨了在嵌入式开发中数据溢出、整数提升等关键陷阱,帮助开发者掌握构建健壮C51代码的正确姿势与最佳实践。 阅读详情
指针转换的时候,出了问题,愿意是想传一个8位的值,通过函数修改后再传回来。函数的参数是16位的。结果却是8位的值取了16位的高字节。编译器使用的Keil。于是写了一个例子(large mode, small mode同样):


#include <stdio.h>


typedef unsigned char INT8U;
typedef unsigned int INT16U;


INT8U fun(INT16U *p)
{


*p = 0×4321;


return *p;


}
void main()
{
INT8U a = 0;
INT8U b = 0;


b = fun((INT16U*)&a);


TI = 1;
printf(“a=0x%x \r\n”, (INT16U)a);  // what’s this?
printf(“b=0x%x \r\n”, (INT16U)b); // and this?


}


结果是什么?
a = 0×43
b = 0×21
======================
原因是什么呢?
在调试的时候,从汇编语句和memory窗口来看,原来是16位指针和8位指针地址位置不一样引起来的。先看图:
1、进入函数时


2、准备返回


3、调用完函数后,a为0×43, b= 0×21.
b通过寄存器传递。


=========
另外一个例子:
INT8U fun(INT16U *p)
{
INT8U *p2;
INT8U c = 0;


p2 = (INT8U*)p;


*p = 0×4321;


c = *p2;  // what’s c


return *p;


}


// c是多少? [0x21]
而如果放到VC6.0上编译运行,结果a = 0×21,  b=0×21.
总结对于C51指针转换来说,如果是普通的转化,和PC, ARM同。如果是函数的指针参数,却要注意。就用正确的指针类型来调用。
 Posted by Ian at 12:52  Tagged with: keil, pointer
C51指针定义 理解C51指针应用 立即下载

相关推荐

KeilC51数据类型转换应注意

本文介绍了在使用C51语言编写程序时数据类型具体使用应注意的问题。

C51基础之单片机编程中通用指针和定向指针

使用不同类型的指针,在处理相同的代码时,在代码大小、占用内存大小和执行时间上存在明显的差异。因为内存类型在编译时确定的,所以定向指针占用的空间大小也是确定的,与8051的地址总线宽度一致。Cx51编译器转换通用指针和定向指针时,可以使用()强制类型转换,也可以由编译器隐式转换。0xFF00强制转换为xdata指针,取出指针空间内的数据,对c变量进行累加。0xF0强制转换为idata指针,取出指针空间内的数据,对c变量进行累加。0xE8强制转换为pdata指针,取出指针空间内的数据,对c变量进行累加。

ltqdxl的博客 5375

手把手教你配置UEFI Secure Boot:从密钥生成到系统验证(附避坑指南)

本文详细介绍了如何配置UEFI Secure Boot,从密钥生成到系统验证的全过程,包括PK、KEK等关键密钥的生成方法,以及常见问题的解决方案。通过实战案例和避坑指南,帮助用户有效提升系统启动安全性,防止恶意软件植入。

weixin_30776273的博客 343

单片机C51中bit强制类型转换

c51中的bit,char的强制类型转换(bit)data<br />data为非0,,bit强制后,为1。否则为0

electricdevelop的专栏 3460

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤。

wyxtx的博客 5664

cmw500 lte非信令测试_WiFi信令测试在研发过程中的作用

  1、关于信令测试的故事  2016年的某天,某著名网络产品公司技术负责人致电寻求技术支持:我们的无线路由器遇到了一个困惑:我们某款路由器应用于实际WiFi网络中时,WiFi终端接入非常困难。但是我们使用测试工具检测此路由器,它的所有物理射频指标都非常优异。不知道是为什么?  我来到了测试现场看到:WiFi路由器受控于芯片公司的测试工具,其WiFi发射机指标在非信令测试仪上显示:无论功率、EVM...

weixin_39662263的博客 3925

指针类型转换 (转载)

<br /><br />1、强制类型转换<br />看一下这个c代码:<br />int a = 0x123456;     //0x是十六进制的表示法<br />char c = (char)a;<br />printf("%x/n", c);<br />在我的编译环境里输出的是什么呢? 是56,怎么得来的呢?<br />int a的内存如下(左边是低地址的内容,右边是高地址的内容):0x56 0x34 0x12 0x00<br />"是不是搞反了?" 有人奇怪(正如我当年~~~~~~),这个问题还得详细

hi_dzj的专栏 2111

Ubuntu22.04+Docker一键部署Autoware Universe避坑指南(附鱼香ROS配置)

本文详细介绍了在Ubuntu22.04系统中使用Docker一键部署Autoware Universe的完整流程,包括鱼香ROS工具链配置、Docker环境优化及VSCode开发环境集成。通过实战指南帮助开发者快速搭建自动驾驶开发环境,解决常见部署问题,提升开发效率。

weixin_29254673的博客 417

(c语言)指针的类型转换

/0100 0000 0200 0000 0300 0000 0400 0000 0500 0000——short*类型存储(2字节)//0000 0000 0000 0000 0300 0000 0400 0000 0500 0000——short*类型存储(2字节)//00000000 00000000 03000000 04000000 05000000——int*类型存储(4字节)//输出结果:0 0 3 4 5。//arr地址:(16进制)//内存中存储数值是倒序存储。

2301_79580018的博客 302

C#实现低通和高通滤波算法

低通滤波器允许通过低于某个截止频率的信号成分,并且抑制高于该频率的成分。而高通滤波器则允许通过高于某个截止频率的信号成分,并抑制低于该频率的成分。巴特沃斯滤波器是一种对称的滤波器,具有平坦的幅度响应和最小的群延迟。低通和高通滤波是数字信号处理中常用的滤波技术,用于滤除或增强信号中的特定频率成分。在本篇文章中,我们将使用C#编程语言来实现低通和高通滤波算法。以上就是使用C#实现低通和高通滤波算法的示例代码。你可以根据自己的需求调整截止频率和采样率,将这些代码应用于你的项目中。是滤波器的截止频率,

XisVisual_Basic的博客 1275

Bootstrap方法详解——技术与实例

一、Introduction 如果说到Bootstrap你会想到什么?是Twitter推出的那个用于前端开发的开源工具包吗?Unfortunately,本文要讨论的并非是Bootstrap工具包,而是统计学习中一种重采样(Resampling)技术。这种看似简单的方法,对后来的很多技术都产生了深远的影响。机器学习中的Bagging,AdaBoost等方法其实都蕴含了Bootstrap的思想...

白马负金羁 8万+

C语言指针强制类型转换

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

mhjcumt的专栏 14万+

YOLOv8【第四章:注意力机制篇·第20节】一文讲透,注意力机制设计原则与选择指南 - 从原理到实践的系统化方法论!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读!

**My Coding Family** 898

8051单片机基础6:通用指针和定向指针

Cx51的指针类型 Cx51编译器支持使用符号*声明的指针变量,用标准C语言定义的指针变量在Cx51编译环境中可以完全兼容使用。但是,因为8051单片机独特的内存架构,Cx51编译环境提供两种不同类型的指针: Generic Pointers-----------------通用指针 Memory-Specific Pointers-------定向指针 使用Memory-Specific Pointers可以明显的加速C语言执行效率。使用不同类型的指针,在处理相同的代码时,在代码大小、占用内存大小和执

电子开发的经验笔记 2289

在SAP系统中,公司间关联交易(Intercompany Transactions)或内部往来主要有三种经典的实现模式。这些模式的选择取决于企业的业务复杂度、自动化需求以及对实时性的要求

SAP系统中公司间关联交易的三种实现模式分析:1)手工记账模式(FB60/FB70)适用于低频交易,灵活性高但易出错;2)SD/MM跨公司销售采购模式(VA01/VF01/ME21N)适用于真实业务流转,业务财务集成度高;3)自动清算模式(F.13/ICR)适合高频交易集团企业,支持实时自动对账。关键成功要素包括正确配置贸易伙伴字段、统驭科目及专用凭证类型。建议根据企业规模、业务复杂度及自动化需求选择合适模式,其中大型集团优先考虑自动对账方案以确保合并报表准确性。

金牌架构师 559

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C51 常见数据类型详解

KEILC51编译器所支持的数据类型如下表所示。1、位变量——bit bit 位变量是C51 编译器的一种扩充数据类型,它的值是一个二进制位,不是0 就是1。2、特殊功能寄存器——sfr sfr 也是一种扩充数据类型,值域为0~255。用于访问51单片机内部的所有特殊功能寄存器。特殊功能寄存器C51定义的一般语法格式如下:3、16位特殊功能寄存器——sfr16 同sfr一样,sfr16为C51的扩充数据类型,只不过是用来定义单片机的内部16位特殊功能寄存器,并且占用两个内存单元。例如:DPT......

timerring的博客 3万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

单片机C语言C51的数据类型

C51的数据类型分为基本数据类型和组合数据类型,情况与标准C中的数据类型基本相同,但其中char型与short型相同,float型与double型相同,另外,C51中还有专门针对于51单片机的特殊功能寄存器型和位类型。 一.字符型char 有signed char和unsigned char之分,默认为signed char。它们的长度均为一个字节,用于存放一个单字节的数据。 对于si...

嵌入式之斋 2万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C51 中指针变量的强制类型转换

unsigned long*类型指针通常指向一个4字节或8字节的整数,在进行强制类型转换后,指针的解释方式将变为以一个字节为单位。内存访问错误:将一个大块的内存解释为字节序列时,如果读取或写入的字节数超过实际分配的字节数,就会导致越界访问,并可能导致程序崩溃或产生不正确的结果。因此,尽管可以进行指针类型的强制类型转换,但需要谨慎使用,并确保在转换后正确处理指针访问以及转换后数据的解释。这样做强制类型转换时,pbb获取到的地址就是地址0,因此*pbb的值就是0,没有达到要将1传输。给pbb所在地址的目的。

dzdesigned的专栏 655

C51的指针语言,Keil C51 中指针的使用

指针是C语言中比较难的一个内容,Keil C51在指针方面有和标准C不一样的地方,今天看了一些资料学习了一下Keil C51 中指针的使用。keil51的指针,包含两种指针:普通指针,兼容标准C;内存特殊指针1普通指针char*ptr;//指针占3字节,第一字节是标识存储类型,第二字节是存储地址高位字节,第三字节是低位字节char*xdateptr;//指针存储在片外,xdate是修饰ptr的ch...

weixin_34626306的博客 1650

Keil 8051中指针存储说明

Keil 8051中指针存储说明 通用或未定型的指针的声明和标准C语言中一样如 char *s; /* string ptr */ int *numptr; /* int ptr */ long *state; /* long ptr */ 通用指针总是需要三个字节来存储   第一个字节是用来表示存储器类型 第二个字节是指针的高字节 ...

weixin_30493321的博客 626

51单片机数值存储c语言教程,单片机c语言教程:C51变量

void main(void){unsigned int a;unsigned char b;do{for (a=0;a50000;a++)P1_0 = 0; //点亮P1_0for (a=0;a50000;a++)P1_7 = 0; //点亮P1_7for (b=0;b255;b++){for (a=0;a10000;a++)P1 = b; //用b的值来做跑马灯的花样}P1 = 255; //...

weixin_35795675的博客 849

C51编译器内存空间警告解析与指针操作实践

在嵌入式开发中,内存管理是核心概念之一,尤其对于8051架构这类采用哈佛结构的微控制器。其程序存储与数据存储分离的特性,使得指针操作必须考虑内存空间属性。通过理解data/idata/xdata等不同存储区域的访问原理,开发者可以避免常见的'POINTER: DIFFERENT MSPACE'警告。本文以Keil C51环境为例,深入解析指针类型转换、抽象指针应用等关键技术,并分享跨空间访问的性能优化方案,帮助开发者编写更高效的嵌入式代码。

weixin_30460489的博客 433

80c51的c语言程序设计,80C51的C语言程序设计概述.ppt

80C51的C语言程序设计概述第9章 80C51的C语言程序设计;9.1 单片机C语言概述 ;Date;9.1.2 C51程序结构;9.2.1 C51的数据类型;尽可能采用无符号格式bit用于定义位变量的名字,编译器会对其分配地址(RAM的20H~2FH 区域)sbit用于定义位变量的名字和地址,地址是确定的且不用编译器分配(SFR及RAM的20H~2FH 区域)C51编译器在编译时会自动进行...

weixin_32842805的博客 401

c语言上机ex11答案,C51单片机的C语言程序设计.ppt

《C51单片机的C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《C51单片机的C语言程序设计.ppt(44页珍藏版)》请在装配图网上搜索。1、2020/6/15,1,第10章80C51的C语言程序设计,单片机C语言概述,10.1,C51的数据类型与运算,10.2,C51流程控制语句,10.3,C51的指针类型,10.4,C51的函数,10.5,C51编程实例,10.6,2020/6/15...

weixin_39792686的博客 192

嵌入式开发必看:Keil C51数据类型转换的那些坑(附error C141解决方案)

本文深入解析了Keil C51嵌入式开发中数据类型转换的常见陷阱,重点剖析了导致error C141语法错误的深层原因。文章详细探讨了符号扩展、数据截断、浮点转换及指针错配等核心问题,并提供了使用标准强制类型转换、显式声明、范围检查及整数运算优化等最佳实践方案,帮助开发者编写出更安全、高效的8051单片机代码。

weixin_29015051的博客 426

c51语言的指针分几类,- 第五课 C51变量

sfr P1 = 0x90; //这里没有使用预定义文件,sbit P1_0 = P1 ^ 0; //而是自己定义特殊寄存器sbit P1_7 = 0x90 ^ 7; //之前我们使用的预定义文件其实就是这个作用sbit P1_1 = 0x91; //这里分别定义P1端口和P10,P11,P17引脚void main(void){unsigned int a;unsigned char b;do{...

weixin_31579367的博客 1068
上一篇: C51 pointers
下一篇: C51指针定义
icodec
博客等级 码龄15年 10粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值