嵌入式C語(yǔ)言學(xué)習(xí)---類型修飾符
一、類型修飾符可以修飾變量存放的范圍,對(duì)內(nèi)存存放資源位置的限定
類型修飾符有:
auto? ?register? static? const? extern? volatile
1.auto 相當(dāng)于把變量放在可讀可寫(xiě)的內(nèi)存區(qū)域,也是最常見(jiàn)的!
例如: auto int a;
如果這個(gè)區(qū)域用{ }包圍,表示在??臻g!
2.register
限制變量定義在寄存器上的修飾符,一些快速訪問(wèn)的變量可以用register
register int a;
編譯器會(huì)盡量的安排CPU的寄存器去存放這個(gè)4個(gè)字節(jié)的,如果寄存器不足時(shí),a還是放在內(nèi)存(存儲(chǔ)器)中。
&(取地址符號(hào))對(duì)register不起作用
內(nèi)存【存儲(chǔ)器】? ? ?? 寄存器
Ox100? ? ? ? ? ? ? ? ? ? ? RO,R2
例如:
#include <stdio.h>
int main()
{
register int a ;
a= 0x10;
printf ("the a is %dn^,&a) ;
return 0;
}
程序運(yùn)行的結(jié)果是:
error: address of register variable 'a’ requested
說(shuō)明給register int a 取地址出錯(cuò)了。
3.stati
靜態(tài)
應(yīng)用場(chǎng)景:
修飾3種數(shù)據(jù):
1)、函數(shù)內(nèi)部的變量
int fun()
{
int a; ===> static int a;
}
2)、函數(shù)外部的變量
int a; ====> static int a;
int fun()
{
}
3)、函數(shù)的修飾符
int fun();===> static int fun();
4.extern
外部聲明
5.const
常量的定義
修飾只讀的變量
const int a= 100;
但是還是可以通過(guò)其他方式修改變量a的值
6.volatile
告知編譯器編譯方法的關(guān)鍵字,不優(yōu)化編譯,在嵌入式底層用的較多
修飾變量的值的修改,不僅僅可以通過(guò)軟件,也可以通過(guò)其他方式(硬件,外部的用戶)
例如:int a = 100;
while( a==100 );
mylcd();
---------------------------
匯編假設(shè)如下:
[a] : a的地址
f1: LDR RO, [a]
f2: CMP R0, #100
f3: JMPeq f1 (沒(méi)有優(yōu)化會(huì)跳轉(zhuǎn)到f1,進(jìn)行循環(huán),但是和內(nèi)存打交道,速度相對(duì)慢)
--->JMPeq f2(編譯的過(guò)程中會(huì)自動(dòng)優(yōu)化,直接跳到f2進(jìn)行循環(huán))
f4: mylcd();
但是往往可能因?yàn)橛|碰了外部的鍵盤(pán)修改了a的值,這樣的優(yōu)化就會(huì)有問(wèn)題,所以此種情況下,應(yīng)該要使用volatile?int a = 100;