您的位置:首页 > 要闻 > 正文

嵌入式C语言学习---类型修饰符

一、类型修饰符可以修饰变量存放的范围,对内存存放资源位置的限定

类型修饰符有:

auto   register  static  const  extern  volatile


(资料图片)

相当于把变量放在可读可写的内存区域,也是最常见的!

例如: auto int a;

如果这个区域用{ }包围,表示在栈空间!

限制变量定义在寄存器上的修饰符,一些快速访问的变量可以用register

register int a;

编译器会尽量的安排CPU的寄存器去存放这个4个字节的,如果寄存器不足时,a还是放在内存(存储器)中。

&(取地址符号)对register不起作用

内存【存储器】       寄存器

Ox100                      RO,R2

例如:

#include <>

int main()

{

register int a ;

a= 0x10;

printf ("the a is %dn^,&a) ;

return 0;

}

程序运行的结果是:

error: address of register variable 'a’ requested

说明给register int a 取地址出错了。

静态

应用场景:

修饰3种数据:

1)、函数内部的变量

int fun()

{

int a; ===> static int a;

}

2)、函数外部的变量

int a; ====> static int a;

int fun()

{

}

3)、函数的修饰符

int fun();===> static int fun();

外部声明

常量的定义

修饰只读的变量

const int a= 100;

但是还是可以通过其他方式修改变量a的值

告知编译器编译方法的关键字,不优化编译,在嵌入式底层用的较多

修饰变量的值的修改,不仅仅可以通过软件,也可以通过其他方式(硬件,外部的用户)

例如:int a = 100;

while( a==100 );

mylcd();

---------------------------

汇编假设如下:

[a] : a的地址

f1: LDR RO, [a]

f2: CMP R0, #100

f3: JMPeq f1 (没有优化会跳转到f1,进行循环,但是和内存打交道,速度相对慢)

--->JMPeq f2(编译的过程中会自动优化,直接跳到f2进行循环)

f4: mylcd();

但是往往可能因为触碰了外部的键盘修改了a的值,这样的优化就会有问题,所以此种情况下,应该要使用volatile int a = 100;

关键词: