变量的存储类别
一、static(静态局部)变量。
1、静态局部变量在程序整个运行期间都不会释放内存。
2、对于静态局部变量,是在编译的时候赋初值的,即只赋值一次。如果在程序运行时已经有初值,则以后每次调用的时候不再重新赋值。
3、如果定义局部变量的时候不赋值,则编译的时候自动赋值为0。而对于自动变量而言,定义的时候不赋值,则是一个不确定的值。
4、虽然静态变量在函数调用结束后仍然存在,但是其他函数不能引用。
二、用extern声明外部变量。
用extern声明外部变量,是为了扩展外部变量的作用范围。比如一个程序能由多个源程序文件组成。如果一个程序中需要引用另外一个文件中已经定义的外部变量,就需要使用extern来声明。
正确的做法是在一个文件中定义外部变量,而在另外一个文件中使用extern对该变量作外部变量声明。
一个文件中: int abc;
另外一个文件中: extern abc;
例子:
用extern将外部变量的作用域扩展到其他文件:
文件1:
//用extern将外部变量的作用域扩展到其他文件中
#include
#include
#include
unsigned int array[10];
void fillarray();
void init_ser()
{
SCON=0X50;
TMOD|=0X20;
TH1=0XF3;
TR1=1;
TI=1;
}
void main()
{
unsigned int i;
init_ser();
fillarray();
for(i=0;i<10;i++)
{
printf("array[%d]=%d\n",i,array[i]);
}
for(;;){;}
}
文件2:
extern int array[10];
void fillarray()
{
unsigned char i;
for(i=0;i<10;i++)
{
array[i]=i;
}
}
在单片机c语言中变量的空间分配几个方法
1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。
2、 data区内最好放局部变量。
因为局部变量的空间是能覆盖的某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),能提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;
3、 确保你的程序中没有未调用的函数。
在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办法。
4、 程序中遇到的逻辑标志变量能定义到bdata中,能大大降低内存占用空间。
在51系列芯片中有16个字节位寻址区bdata,其中能定义8*16=128个逻辑变量。定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中。
5、 其他不频繁用到和对运算速度要求不高的变量都放到xdata区。
6、 如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。
7、 当使用到指针时,要指定指针指向的内存类型。
在单片机c51语言中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为: char data *p;。还可指定指针本身的存放内存类型,如:char data * xdata p;。其含义是指针p指向data区变量,而其本身存放在xdata区。