在嵌入式系統的程式設計中,常常要求在特定的記憶體單元讀寫內容,彙編有對應的mov指令,而除c/c++以外的其它程式語言基本沒有直接訪問絕對位址的能力。在嵌入式系統的實際除錯中,多借助c語言指標所具有的對絕對位址單元內容的讀寫能力。以指標直接操作記憶體多發生在如下幾種情況:
(1)某i/o晶元被定位在cpu的儲存空間而非i/o空間,而且暫存器對應於某特定位址;
(2)兩個cpu之間以雙埠ram通訊,cpu需要在雙埠ram的特定單元(稱為mail box)書寫內容以在對方cpu產生中斷;
(3)讀取在rom或flash的特定單元所燒錄的漢字和英文本模。
例如:
unsigned char *p = (unsigned char *)0xf000ff00;
*p="11";
以上程式的意義為在絕對位址0xf0000+0xff00(80186使用16位段位址和16位偏移位址)寫入11,在使用絕對位址指標的時候,指標自增自減操作的結果取決於指標指向的資料類別。
指向:位址就意味著指向,因為通過位址能找到具有該位址的物件。對於指標變數來說,把誰的位址存放在指標變數中,就說此指標變數指向誰。但應注意:並不是任何型別資料的位址都可以存放在同乙個指標變數中的,只有與指標變數的基型別相同的資料的位址才能存放在相應的指標變數中。例如:
int a, *p;
float b;
p=&a;
p=&b;
指標的運算:
(1)指標和整數的加減運算:
可以通過指標與整數的加減運算來移動指標p,實現對不同資料單元的訪問操作。對不同的資料型別,移動的單位長度不同。單位長度一般是指標所指向的變數的資料型別長度。
格式一:p=p+n;(或p=p-n;)
格式二:p++;(或p–;)
格式三:++p;(或–p;)
注意:指標變數的值加1(或減1),並不是給位址加1(或減1),而是加上(或減去)1個資料型別長度,
也就是指標所指向的變數在記憶體中所佔的位元組數。
指標和指標的賦值運算:
int a=10,*p,*q;
p=&a;
q=p;
//p和q的值都是變數a的位址。
指向指標的指標關係:
(1)*二級指標變數:代表所指向的以及指標變數。如:*q就代表p;
(2)**二級指標變數:代表它所指的一級指標變數所指向的變數。如:**q代表a;
(3)*一級指標變數:代表它所指向的變數。如:*p代表a。
int *p, a[10];
p=a;
p是指向 int 型型別的指標變數,顯然,p 只能指向 a 陣列中的元素,而不是指向整個陣列。在進行賦值時一定要先確定賦值號兩側的型別是否相同,是否允許賦值。對p=a, 準確地說應該是:p 指向 a 陣列的首元素,在不引起誤解的情況下,有時也簡稱為:p指向a 陣列。 同理,p 指向字串,應理解為 p 指向字串中的首字元
用指標引用結構體變數成員的方式:(*指標變數名).成員名:
# include # include struct age
;struct student
;int main(void)
簡化方式:指標變數名->成員名,其中的->是「指向結構體成員運算子」,它的優先順序同結構體成員運算子「.」一樣高
# include # include struct age
;struct student
;int main(void)
結構體陣列的每乙個元素都是乙個結構體變數。如果定義乙個結構體指標變數並把結構體陣列的陣列名賦給這個指標變數的話,就意味著將結構體陣列的第乙個元素,即第乙個結構體變數的位址,也即第乙個結構變數中的第乙個成員的位址賦給了這個指標變數。
例題:有乙個結構體變數stu,內含學生學號、姓名和三門學科的成績,通過呼叫函式print使他們輸出
struct student;
void print(struct student stu,struct student *pstu)
int main()
動態儲存分配函式:
1、malloc函式:
函式原型為void *malloc(unsigned int size);
其作用是在記憶體的動態儲存中分配乙個長度為size的連續空間(size是乙個無符號數)
此函式的返回值是乙個指向分配域起始位址的指標(void)。
如果此函式未能成功地執行(例如記憶體空間不足),則返回null.
2、calloc函式:
函式原型是void *calloc (unsigned n,unsigned size)
其作用是在記憶體的儲存區中分配n個長度為size的連續空間。
函式返回乙個指向分配域起始位址的指標。
如果分配不成功,返回null
用calloc函式可以為一維陣列開闢動態儲存空間,n為陣列個數,每個元素長度為size
3、free函式:
函式原型是void free(void *p)
其作用是釋放由p指向的記憶體區,使這部分記憶體區能被其他區使用
p是最近一次呼叫calloc或者malloc函式的時候返回的值
嵌入式學習第三次作業
void calloc int num,int size 在記憶體中動態地分配 num 個長度為 size 的連續空間,並將每乙個位元組都初始化為 0。所以它的結果是分配了 num size 個位元組長度的記憶體空間,並且每個位元組的值都是0。void free void address 該函式釋放...
嵌入式技術第三次課堂筆記
今日課堂目標 嵌入式linux開發工具 vim gcc gdb make vim文字編輯器 學會使用和如何配置vim gcc編譯器 學會製作動態庫和靜態庫及使用與區別 gdb偵錯程式 設定斷點 單步執行 除錯記憶體錯誤 make工程管理器 編寫makefile檔案 首先是linux文字編輯器,vim...
嵌入式C學習第三次任務
指令 描述void calloc int num,int size 在記憶體中動態地分配 num 個長度為 size 的連續空間,並將每乙個位元組都初始化為 0。所以它的結果是分配了 num size 個位元組長度的記憶體空間,並且每個位元組的值都是0。void free void address ...