2b.C语言全局变量和静态变量

104 阅读3分钟

局部与全局

局部变量也称为内部变量。局部变量是在函数内定义的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。

在复合语句中也可定义变量,其作用域只在复合语句范围内

main.c

void main(){
    int a=1;
}
​
void add(){
    //在这个方法中无法使用a变量
}

全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序

main.c

int a=1;
void main(){
    printf("%d",a);//输出:1
}
​
void add(){
    printf("%d",a);//输出:1
}

甚至另外一个文件都可以使用a变量,只需要引入即可

hello.c

extern int a;
void main(){
    printf("%d",a);//输出:1
}
​
void add(){
    printf("%d",a);//输出:1
}

变量存储类别

C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。

静态存储方式: 是指在程序运行期间分配固定的存储空间的变量。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。

动态存储方式: 是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。

C语言中存储类别又分为四类:

1.自动(auto)

2.静态(static)

3.寄存器的(register)

4.外部的(extern)

auto: 用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式

void main(){
    auto int a=1;
}

static: 用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量

静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。

静态局部变量在编译时赋值,只赋初值一次;在定义静态局部变量时不赋值的话,编译时自动赋值0

static int a=1;
void main(){
    static int b=1;
}

静态全局变量只能在本文件使用,别的文件无法引入

静态方法也只能在本文件使用,别的文件无法引入

register: 为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明

只有局部自动变量和形式参数可以作为寄存器变量,局部静态变量不能定义为寄存器变量

一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;

void main(){
    register int a=1;
}

extern: 用于引入外部变量