首先,变量的存储类型可分为四类:自动类型(auto),寄存器类型(register),静态类型(static),外部类型(extern)
动态变量: 自动类型(auto) 寄存器类型(register)
静态变量 :静态类型(static) 外部类型(extern)
1、自动类型(auto):
属于动态全局变量,可以省略auto标识符,因此,我们所使用的局部变量都是自动类型的变量
2、寄存器类型(register):
属于动态局部变量,寄存器的存取速度比内存快。
因为计算机中寄存器的个数是有限的,而且寄存器的位数也是有限的,所以在使用register说明变量时注意以下几点:
(1)寄存器类型的变量不能过多,一般把使用频繁的变量放在寄存器中。
(2)变量的长度应该和寄存器的长度相同,一般为int或者char类型
(3)现在的编译器能够识别使用比较频繁的变量,并且能够不需要编程人员做出寄存器存储类型定义的情况下,就把这些变量放在寄存器中,所以寄存器变量的定义一般是不需要的
3、静态类型(static):
静态类型可分为静态局部变量和静态全局变量,静态类型有默认值,int 为0,float为0.0,char为’\0’。
1>静态局部变量也是局部变量,特点:(1)它的生存期是在横隔程序的运行期间(2)其作用域仅在定义它的函数内。
(3)静态局部变量赋初值是在编译阶段,并且只被赋值一次
#include <stdio.h>
long fac(int n)
{
//f为静态局部变量,在fac函数内定义,所以只在fac函数内部有效,开始赋初值f=1且一直保持为1
static long f=1;
f=f*n;
return f;
}
int main()
{
int k;
for(k=1;k<=5;k++)
{
printf("%d!=%d",k,fac(k));
}
printf("\n");
}
2>静态全局变量
如果我们的程序只在一个文件中,那么静态全局变量和全局变量没有任何区别;如果程序由多个文件组成,那么两者是完全不同的
静态全局变量只被它所在的文件独享
特点:(1)作用域为定义它的文件(2)生存期为整个程序运行时期(3)使用静态全局变量的好处是可以在两个不同的源文件程序中可以使用相同名称的变量
例如:
file1源文件程序如下:
#include <stdio.h>
static int n;//定义一个静态全局变量,只在file1文件内有效
void f(int t)
{
n=n*x;
printf("%d\n",n);//因为n没有赋初值,且为静态类型,有初始值0,所以此处输出为0
}
file2源文件代码如下:
#include <stdio.h>
int n;//定义一个全局变量
void f(int);
void main()
{
n=100;
printf("%d\n",n)//输出100
f(5);
}
4、外部类型(extern):
在任何函数外部定义的变量都叫外部变量
在一个文件中定义的全局变量默认是外部,可省略extern关键词,但是如果其他文件要用这个文件定义的外部变量时,则必须使用extern 作外部声明
例:
file1源文件代码如下:
#include <stdio.h>
extern int a;//定义外部变量,使用file2的a
extern int sum(int x);//定义外部类型函数,使用file2文件的函数
void main()
{
int c;
c=sum(a);//求从1到20的和
printf("1+2+...+%d=%d\n",a,c);
}
file2源文件代码如下:
int a=20;
int sum(int x)
{
int i,y=0;
for(i=1;i<=x;i++)
{
y=y+i;
}
return y;
}
没有举太多的代码例子,包括注释也不是很多,建议大家多写一些代码来加深理解。
奔涌吧!后浪们!
下面是有道云笔记的链接:
文档:静态变量与动态变量.note
链接:http://note.youdao.com/noteshare?id=60363213670b9e2939016dff498dc78b&sub=294C4F7223A945DFB3E5D61BBDA57AD3