1. 程式人生 > >詳解C++/C中的資料在記憶體中的存取

詳解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的精華之民在吧!

相關推薦

VS2010 Chart控件(一)Chart控件在ASP.NET網站的應用示例C#語言)

[1] 設置 cti write conf int 應用程序 itl config 步驟如下: 1、 Chart控件(一)Chart控件在ASP.NET網站中的應用示例詳解(C#語言)" title="VS2010 Chart控件(一)Chart控件在ASP.NET網站中的

Objective-C委託和協議

Objective-C委託和協議本沒有任何關係,協議如前所述,就是起到C++中純虛類的作用,對於“委託”則和協議沒有關係,只是我們經常利用協議還實現委託的機制,其實不用協議也完全可以實現委託。 AD:51CTO 網+ 第十二期沙龍:大話資料之美_如何用資料驅動使用者體驗

jsp頁面jstl標籤 包括< c:choose><c:foreach> <c:when> <c:otherwise>

JSLT標籤庫,是日常開發經常使用的,也是眾多標籤中效能最好的。把常用的內容,放在這裡備份一份,隨用隨查。儘量做到不用查,就可以隨手就可以寫出來。這算是Java程式設計師的基本功吧,一定要紮實。JSTL全名為JavaServer Pages Standard Tag Library,目前最新的版本為1.1版。

C語言的指標和p, p+1, *(p+1), *P+1, p[0], &p[0] 的含義

解析:C語言中的指標和p, p+1, *(p+1), *P+1, p[0], &p[0] 每一種表示式的含義  一、先解決一個問題:什麼是指標 指標就是存放地址的變數。很好,百度上就是這個答案(哈哈,感覺這句話很廢話)。 指標是一個大小固定為4個byte的變數,不管

關於 C# Linq 隨機排序的有效解決方法

在做資料操作的時候,隨機排序難免都會遇到。而如果使用 Linq 進行資料操作的話,你會發現 Linq 並沒有提供隨機排序的方法。而百度一下“Linq 隨機排序”可以找到N多的方法,要非常簡單的也有,要非常複雜也有,但是,這些方法裡也有N多是行不通的,也有看到一篇博文,列出了

】銀行信用評分卡的WOE在幹什麼?WOE的意義?為什麼可以使用WOE值代替原來的特徵值來做LR的訓練輸入資料

其實我是帶著這個問題發現這篇帖子的 為什麼可以使用WOE值代替原來的特徵值來做LR的訓練輸入資料 以下為原文 https://zhuanlan.zhihu.com/p/30026040 WOE & IV woe全稱叫Weight of Evidence,常用在風險評估、授

C語言的細節問題】C/C++浮點數在記憶體的儲存方式

C/C++浮點數在記憶體中的儲存方式 本文轉載自:https://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html        任何資料在記憶體中都是以二進位制

C++之記憶體管理——在堆申請100個char型別的記憶體,拷貝Hello world字串到分配的堆記憶體,列印字串,最後釋放記憶體

首先先看一下簡單的案例 程式碼如下 #include<iostream> using namespace std; int main() { //整數1 int *x = new int; if(NULL==x) { return 0;

C++遍歷資料的檔案並把結果儲存到csv

StaDir.h檔案 #pragma once #include "browsedir.h" class CStaDir : public CBrowseDir { public: CStaDir(void); ~CStaDir(void); int m_nFileCount;

資料結構之:AVL樹C++模板實現

AVL樹簡介AVL樹的名字來源於它的發明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL樹是最先發明的自平衡二叉查詢樹(Self-Balancing Binary Search Tree,簡稱平衡二叉樹)。一棵AVL樹有如下必要條件:條件一:它必

資料結構圖文解析之:佇列C++模板實現

正文 回到頂部 0. 資料結構圖文解析系列 回到頂部 1. 佇列簡介 回到頂部 1.1 佇列的特點 佇列(Queue)與棧一樣,是一種線性儲存結構,它具有如下特點: 佇列中的資料元素遵循“先進先出”(First In First Out)的原則,簡稱FI

資料結構圖文解析之:二叉堆C++模板實現

0. 資料結構圖文解析系列 1. 二叉堆的定義 二叉堆是一種特殊的堆,二叉堆是完全二叉樹或近似完全二叉樹。二叉堆滿足堆特性:父節點的鍵值總是保持固定的序關係於任何一個子節點的鍵值,且每個節點的左子樹和右子樹都是一個二叉堆。 當父節點的鍵值總是大於或等於任何一個子節點的鍵值時為最大堆。 當父節點的鍵值總是小於

資料結構圖文解析之:哈夫曼樹與哈夫曼編碼C++模板實現

0. 資料結構圖文解析系列 1. 哈夫曼編碼簡介 哈夫曼編碼(Huffman Coding)是一種編碼方式,也稱為“赫夫曼編碼”,是David A. Huffman1952年發明的一種構建極小多餘編碼的方法。 在計算機資料處理中,霍夫曼編碼使用變長編碼表對源符號進行編碼,出現頻率較高的源符號採用較短的編碼,

C語言實現資料結構的鏈棧

實現方式一# include <stdio.h># include <stdlib.h>typedef char NodeData;//鏈棧typedef struct Node

C語言(1)資料型別

資料型別 關於C語言詳解系列部落格的目錄:https://blog.csdn.net/snake_lp/article/details/78630717點選開啟連結一,概述資料型別就是固定記憶體大小空間

C++編寫利用資料結構佇列(Queue)打印出使用者所指定長度的楊輝三角

#include <iostream> #include <assert.h> using namespace std; class Yanghui{ public:  class Node{  public:   Node():data(0){  

準確C/C++ float、double資料型別的表示範圍及精度

 今天覆習C++遇到了float、double資料型別的表示範圍及精度問題,花費了一些時間重新梳理了一遍,鑑於網上很多文章寫的並不清晰,並且有不少疏漏錯誤之處,特結合個人理解仔細整理如下。   要弄清楚這個問題,首先要搞清楚浮點數在記憶體中的儲存方式。浮點數,區別於定點數

c語言實現資料結構的連結串列原始碼

#include <stdio.h> #include <stdlib.h> typedef struct LNode *List; struct LNode { int data; List next; }; struct LNode L;

C++成員函式在記憶體的儲存方式

        用類去定義物件時,系統會為每一個物件分配儲存空間。如果一個類包括了資料和函式,要分別為資料和函式的程式碼分配儲存空間。按理說,如果用同一個類定義了10個物件,那麼就需要分別為10個物件

用Navicat工具將Excel的數據導入Mysql

tro edit http ges fda 數據導入 csv sql 成功 首先你需要準備一份有數據的Excel,PS: 表頭要與數據庫表中字段名對應:      然後 “文件--->另存為.csv 文件” 如果你的數據中帶有中文,那麽需要將CSV文