`
yidongkaifa
  • 浏览: 4059569 次
文章分类
社区版块
存档分类
最新评论

详解C++/C中的数据在内存中的存取

 
阅读更多

本文介绍了指针的一个使用技巧,可以通过此方法将单片机中的变量按字节保存到EEPROM中,也可以从EEPROM中还原一个多字节的整型数或者浮点数。

在内存中变量对整数类型,包括
char, unsigned char, int, unsigned int, long, unsigned long
多于一个字节的按低字节在前,高字节在后的顺序存储的,比如
int iv = 0x1234,则在内存中的存储顺序,从地址由低到高的顺序排列,其值分别为: 34 12
long lv = 0x11223344则在内存中的顺序为: 44 33 22 11
如果想修改一个整型数的某个字节,则可以运用指针直接进行操作如下所示:
unsigned char *puc;
int i;
long lv = 0x11223344;
unsigned char temp[4]={0,0,0,0};

*puc = (unsigned char*)(&lv);
for(i=0; i{
temp = *(puc+i);
}
运行后temp中的值则为temp[]={0x44, 0x33,0x22,0x11};
如果要修改一个数的值也可以直接用以上方法把赋值前后的操作数对调一下即可
*(puc+i) = temp;
即可通过*puc将temp中的单字节数转换为一个长整型数赋给 lv
这种操作方法对数据的存储很有用,可以通过指针将长整型的数分别一个字节一个字节地写到文件中,读的时候按照同样的顺序再从文件中读到内存。当然在PC上也可以直接将长整型的数写到文件中,而在单片机中则只能一个字节一个字节地将数据写入到EEPROM中,通过这种指针操作就可以写到EEPROM中,或者读出整型或者浮点型数。以下为在ICCAVR中将数据写入到EEPROM和读出的程序。
void EEPROMWriteLong( int addr, // address in EEPROM
long dsrc) // source data
{
unsigned char *puc;

puc = (unsigned char*)(&dsrc);
EEPROMWriteBytes(addr, (void*)puc, sizeof(long));
}

long EEPROMReadLong( int addr)
{
long res;
unsigned char *puc = (unsigned char*)(&res);
EEPROMReadBytes(addr, (void*)puc, sizeof(long));
return res;
}

指针真是一个好东东,用好了就像一把无坚不摧锐利无比的长矛,但是用不好了可是会扎自己哦,这就是C的精华之民在吧!

分享到:
评论

相关推荐

    redis使用c++ API 的hiredis连接详解

    此代码实现了redis使用hiredis c接口开发,具体实现了string和list类型的存取,具体信息请看 https://blog.csdn.net/bwangk/article/details/83060374

    C/C++如何获取当前系统时间的实例详解

    C库中与系统时间相关的函数定义在头文件中, C++定义在头文件中。 一、time(time_t*)函数 函数定义如下: time_t time (time_t* timer); 获取系统当前日历时间 UTC 1970-01-01 00:00:00开始的unix时间戳 参数...

    java堆栈的区别 -- 详解

    另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活 2.5堆和栈中的存储内容 栈: 在函数调用时,...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    18.1.4 在函数中抛出异常 546 18.1.5 异常说明 547 18.2 异常处理的编程技术 549 18.2.1 抛出异常的时机 549 18.2.2 异常类的层次结构 552 18.2.3 测试可用内存 552 18.2.4 再次抛出异常 552 第19章 标准...

    c++ 一个二进制串转化为整数的解决方法

    您可能感兴趣的文章:C++ 十进制转换为二进制的实例代码C++实现string存取二进制数据的方法C++实现读入二进制数并转换为十进制输出详解C++编程中对二进制文件的读写操作C++二进制翻转实例分析C++中几种将整数

    C++利用MySQL API连接和操作数据库实例详解

    它提供了程序语言和统一数据访问方式OLE DB的一个中间层,也就是Microsoft提出的应用程序接口(API)用以实现访问关系或非关系数据库中的数据。 ODBC(Open DataBase Connection)开放式系统互连,是一

    c++学习经典图书:C++ 编程思想(全).rar

    本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

    C++ Builder编的远程控制(特洛伊?)程序

    一个国人用C++ Builder编的远程控制(特洛伊?)程序,可以存取删除及修改 对方文件,甚至可以重新启动对方计算机,破坏其操作系统.适用于:Win9X/ Win NT/ Win2000

    【软件加密技术内幕】

    3.1.6 线程环境详解<br/><br/> 3.1.7 如何在另一个进程中注入代码<br/><br/>3.2 利用调试API编写脱壳机<br/><br/> 3.2.1 tElock 0.98脱壳简介<br/><br/> 3.2.2 脱壳机的编写<br/><br/>3.3 利用调试API制作内存补丁...

    软件加密技术内幕

    3.1.6 线程环境详解<br/><br/> 3.1.7 如何在另一个进程中注入代码<br/><br/>3.2 利用调试API编写脱壳机<br/><br/> 3.2.1 tElock 0.98脱壳简介<br/><br/> 3.2.2 脱壳机的编写<br/><br/>3.3 利用调试API制作内存补丁...

    c++ 向量使用案例+源码

    c++ 向量的详解,vector(向量):可以随机存取,但是费时间,开辟内存不会自动释放

    C++ 单链表的基本操作(详解)

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。 链表中的数据是以结点来表示的,每个结点的构成:元素 + 指针,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。...

    Java Bug模式详解

    Java.Bug模式详解 第1章 混乱环境下的灵活方法 1.1 软件设计、实现和维护的趋势 1.1.1 对于稳定、安全 系统的需求增加 1.1.2 传统软件工程技 术的局限性 1.1.3 开放源代码的软 件项目的可利用性 1.1.4 对于...

    DBGridEh of Enlib 3.0组件

    ● 使用专门的函数和过程来存取以reg或ini文件格式保存的表格布局(包含各数据列表、数据列访问顺序、列宽、索引标识、行高等信息)文件。 ● 通过设置数据单元格的hint和ToolTips属性,当移动鼠标到该单元格时,...

    Tcl_TK编程权威指南pdf

    我一直使自己在很大程度上保持着一个Tcl程序员的角色,而我们工作组中的其他人员则埋头于Tcl本身的C语言实现。我创建的应用程序有HTML编辑器、EMAIL比用户接口程序、Web服务器以及用户数据库,我们的商务应用就建立...

    加密解密.技术内幕.chm

    3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个进程中注入代码3.2 利用调试API编写脱壳机 ...

    软件加密技术内幕 chm

    软件加密技术内幕 要花时间看 第1章 PE文件格式深入研究 1.1 PE文件格式格式纵览 1.1.1 区块(Section) 1.1.2 相对虚拟地址(Relative ...附录A 在Visual C++中使用内联汇编 附录B 在Visual Basic中使用汇编

Global site tag (gtag.js) - Google Analytics