变量的存储类别
动态存储与静态存储
从变量的产生时间上可以分为静态存储和动态存储.
静态存储就是指程序运行分配固定的存储方式,而动态存储则是在程序运行期间根据需要动态的分配存储空间.
auto变量
auto关键字就是修饰一个局部变量为自动的,每次执行到定义该变量是都会产生一个新的变量,并对其重新进行初始化.
#include <stdio.h> void printfa(){ auto int a=1; a=a+1; printf("%d",a); } int main(int argc, char *argv[]) { printfa(); printfa(); return 0; } // 2 // 2
局部变量的默认存储方式就是auto,定义时可以忽略
static变量
static变量为静态变量,将函数内部和外部的变量声明成static的意义是不一致的.
对于局部变量来说,static变量和auto变量是相对而言的.在语句块执行期间,static变量将始终保持他的值(地址不变),并且初始化操作只在第一次执行时起作用.
#include <stdio.h> void printfa(){ static int a=1; a=a+1; printf("%d",a); } int main(int argc, char *argv[]) { printfa(); printfa(); return 0; } //2 //3
register变量
register变量称为寄存器存储类变量.使用register的目的是把某个局部变量存放在计算机的某个硬件寄存器而不是内存中.这样的好处是可以提高程序的运行速度,不过这只是反映了程序员的主观意愿,实际上编辑器可以忽略register对变量的修饰.
用户无法获得寄存器变量的地址,因为绝大多数计算机的硬件寄存器都不占用内存地址.而且即时编译器忽略了register而把变量存放在可设定的内存中,也是无法获取变量的地址的.
如果想要有效的利用寄存器register关键字,必须向汇编语言程序员那样了解处理器的内部结构,知道可用于存放变量的寄存器数量,种类以及工作方式.但是,在不同的计算机对于这些细节可能是不同的,因此,对于一个要具备可移植的程序来说,register的作用并不大/
extern变量
extern变量称为外部存储变量.extern声明了程序中将要用到但尚未定义的外部变量.通常,外部存储类都用于声明在另一个转换单元中定义的常量.
一个工程是由多个C文件组成的.这些源代码文件分别编译,然后链接成一个可执行模块.把这样的一个程序作为一个工程进行管理,并且生成一个工程文件来记录所包含的所有源代码文件
//app01 #include <stdio.h> int main(int argc, char *argv[]) { extern int i; printf("%d",i); return 0; } //app02 #include <stdio.h> int i=100; //执行app01 结果100