在C语言中,每一个变量和函数都有两个属性:数据类型和数据存储类型;
数据类型:int 、long、short、char、float、double,以及对应的指针类型;
数据的存储类型:
可以划分两大类型:静态存储类型和动态存储类型;
具体包括:自动的(auto)、静态的(static)、外部的(extern)、和寄存器的(register)
自动变量
在函数中定义的局部变量,如果没有进行专门的说明,对它们的存储空间的分配和释放工作,均有操作系统自动处理,这类局部变量称为自动变量。自动变量用关键词 auto 作为存储类型。定义的数据在栈区(动态存储区)。
静态变量
有时希望函数中的局部变量的值在调用结束后不消失,继续保持原值,即其占用的存储单元不释放,在下一次再调用该函数时,该变量为上次函数调用结束的值。这时就应该指定该局部变量为“静态局部变量”。
如果在定义局部变量时不赋初值,则对于静态局部变量来说,编译时自动赋初值0(对于数值型变量)或 ‘\0’(对于字符变量)。
虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。因为它是局部变量,只能被本函数引用,而不能被其他函数引用。
静态变量声明:
static 类型 变量名列表;
例如: static int a,b,c;
声明 a、b、c为静态存储类型的变量。
静态变量又可以划分为静态局部变量和静态全局变量。定义的数据存储在内存的静态区。
如果程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这是可以在定义外部变量时加一个 static 声明;
加上 static 声明后,只能用于本文件的外部变量叫静态外部变量。
用static 声明的函数为内部函数,只能本文件内的函数调用,其他文件的函数不能调用。该函数称为 “内部函数”,若 函数没有用static 声明则,该函数为 “外部函数” 可以被其他文件的函数调用。
在需要调用其他文件的函数时,需要对 想要调用的函数进行声明(可省略)
寄存器变量
寄存器存储类型:将相关变量的值存储在CPU的通用寄存器中;
由于计算机的运算器和通用寄存器均集成在CPU的内部,因此,数据读写时间比内存块的多,一般快一个数量级以上;
但CPU内部的寄存器优先,不可能定义太多寄存器变量。一般定义几个循环变量;
当寄存器用完,定义成寄存器存储类型的变量会自动转变成普通变量。
寄存器变量的定义方式:
register 类型 变量列表;
例如: register int i,j,k;
定义了 i、j、k三个整型的寄存器变量。
全局变量(外部变量)
全局变量都是存放在静态存储区中的。因此它们的生存期是固定的,存在于程序的整个运行过程。
如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。在定义点之前的函数不能引用该外部变量。
如果在定义点之前的函数需要引用该外部变量,则应该在引用之前用关键字 ‘extern’对该变量作 “外部变量声明”。
外部变量声明格式:
extern 类型 变量列表;
例如: extern float x、y;
C语言允许一个程序分成若干个文件,也就是一个程序写在几个文件中,每一个文件可以单独编译成二进制代码文件(目标文件);
然后在连接时把它们拼成一个可执行程序。
系统在编译过程中遇到extern时:
1、现在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域;
2、如果找不到,就在连接时从其他文件中找外部变量的定义。如果从其他文件中找到了,就将作用域扩展到本文件;
3、如果再找不到,就按出错处理。
外部变量有:同一文件的外部变量、不同文件的外部变量。
同一文件的外部变量:
C语言要求 ”先声明、后引用“;
也就是所以变量在引用之前必须已经声明;如果在一个文件内,声明在后,则需要在引用之前声明为外部变量。