只读的常量大部分情况会放在flash里,有时编译器为了提高速度会把他放在RAM里面,只读的常量常常在前面使用const修饰。
const:保证常量不能够修改
volatile:易变的,加上之后防止编译器优化
由下图可知,占据空间小的常量(a,D,b)放在了RAM中,占据空间大(C)的常量C没有放在RAM中
修饰词volatile不加的话也不会放在RAM中
volatile const int a = 0X12345678;
volatile const int D[1] ;
volatile const int C[512] ;
char b;
int main()
{
b=2;
while(1)
{
}
}
指针占据的字节空间一定是4(对于32位处理器来说)
int main()
{
b=0;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
USART3_Init (9600);
printf("sizeof(int)=%d,sizeof(char)=%d\r\n",sizeof(int),sizeof(char));
printf("sizeof(int *)=%d,sizeof(char *)=%d\r\n",sizeof(int *),sizeof(char *));
while(1)
{
}
}
1.volatile:下列程序如果没有第一句话,程序是这样执行的:
i首先是一个变量,变量一定存在内存里面,CPU从内存里面读i到CPU里面,之后的++cpu只会在CPU里面加,加的结果不会写到内存里面改变i的值。
如果有第一句话,程序是这样执行的:
CPU从内存里面读i到CPU里面,在CPU里面++之后,将数据重新写到内存里面,改变i的值
注意:一般来讲,变量不会使用加volatile的办法,但是下面这个情况除外
读硬件寄存器的值的时候,要用volatile,防止CPU将数据备份到CPU,从而使得之后每次读到的数据都一样。
volatile int i;
for(i=0;i<10;i++);
2.const 目的是为了不让其他人改变某个常量的值,如
const int a = 0X12345678;
int main(void)
{
a=1;
while(1)
{
}
}
3.static 静态的
第一句话作用域为整个文件
第二句话作用域为当前文件
注意:一个文件首先使用自己有的变量,没有的话才会使用全局的
int i;
static int i;
4.extern
a.c文件如果要使用b.c文件的变量c的时候,有以下两种方法。推荐第一种
1.
#include “b.h”
在b.h里面有这样一句话
extern int c;
2.
在a.c文件有这样一句话
extern int c;
5.-weak
该关键词修饰函数的时候,意思是该函数被弱化,如果用户重新定义了这个函数,使用的时候会调用用户定义的函数,否则,调用被弱化的函数。
再加一点
a=1;是执行语句
extern int a;是声明语句,告诉编译器a是什么