第十三章-变量类型
- 变量也是有分类型的,不同类型的变量有不同的存储类型、不同的生命周期、不同的作用域,C语言也提供了一些关键字来设置变量的属性(比如设置存储类型、生命周期)。
变量的作用域
全局变量与局部变量
根据变量的作用域,可以分为:
- 局部变量
- 定义:在函数(代码块)内部定义的变量(包括函数的形参)
- 作用域:从定义变量的那一行开始,一直到代码块结束
- 生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收
- 没有固定的初始值
- 全局变量
- 定义:在函数外面定义的变量
- 作用域:从定义变量的那一行开始,一直到文件结尾(能被后面的所有函数共享)(可以跨文件使用的)
- 生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁
- 默认的初始值就是0
#include <stdio.h>
//全局变量
int age;
void test(){
//局部变量
int age;
age = 10;
}
int main(){
printf("%d\n", age);// 0
//局部变量
int age = 20;
printf("%d\n", age);// 20
test();
printf("%d\n", age);// 20
return 0;
}
变量的存储方式
- 变量有两种不同的存储方式:
- 静态存储方式:程序运行期间由系统分配固定的存储空间
- 动态存储方式:程序运行期间根据需要进行动态的分配存储空间
- 内存中供用户使用的存储空间分为3大块:
- 程序区
- 静态存储区
- 动态存储区(也叫栈区)
- 数据分布存放在静态存储区和动态存储区中.
- 静态存储区放以下类型的变量
- 全局变量全部存放在静态存储区中.程序一开始就会分配固定的存储单元,知道程序结束释放
- static 修饰的局部变量
- 动态存储区存放以下数据:(函数结束,内存释放)
- 函数的形式参数.在调用函数时给形参分配存储空间
- 函数中定义的没有用关键字static声明的变量,即自动变量
- 函数调用时的现场保护和返回地址等
变量的存储类型
- 变量的存储类型就是指变量存储在什么地方。
- 有3个地方可以用于存储变量:普通内存、运行时堆栈(也是内存中的一部分)、硬件寄存器。
- 变量的存储类型决定了变量何时创建、何时销毁以及它的值能保持多久,也就是决定了变量的生命周期。
- C语言根据变量的存储类型的不同,可以把变量分为:自动变量、静态变量、寄存器变量。
自动变量(auto变量)
- 自动变量一定是局部变量
- 自动变量是存储在堆栈中的。
- 哪些是自动变量:被关键字auto修饰的局部变量都是自动变量,但是极少使用这个关键字,基本上是废的,因为所有的局部变量在默认情况下都是自动变量。
- 生命周期:在程序执行到声明自动变量的代码块(函数)时,自动变量才被创建;当自动变量所在的代码块(函数)执行完毕后,这些自动变量就会自行销毁。如果一个函数被重复调用,这些自动变量每次都会重新创建。
静态变量
- 静态变量是存储在静态内存中的,也就是不属于堆栈。
- 哪些是静态变量:
- 所有的全局变量都是静态变量
- 被关键字static修饰的局部变量也是静态变量
- 生命周期:静态变量在程序运行之前创建,在程序的整个运行期间始终存在,直到程序结束。
寄存器变量
- 寄存器变量一定是局部变量
- 存储在硬件寄存器中的变量,称为寄存器变量。寄存器变量比存储在内存中的变量访问效率更高(默认情况下,自动变量和静态变量都是放在内存中的)
- 哪些变量是寄存器变量:
- 被关键字register修饰的自动变量都是寄存器变量
- 只有自动变量才可以是寄存器变量,全局变量和静态局部变量不行
- 寄存器变量只限于int、char和指针类型变量使用
- 生命周期:因为寄存器变量本身就是自动变量,所以函数中的寄存器变量在调用该函数时占用寄存器中存放的值,当函数结束时释放寄存器,变量消失。
- 使用注意:
- 由于计算机中寄存器数目有限,不能使用太多的寄存器变量。如果寄存器使用饱和时,程序将寄存器变量自动转换为自动变量处理
- 为了提高运算速度,一般会将一些频繁使用的自动变量定义为寄存器变量,这样程序尽可能地为它分配寄存器存放,而不用内存
变量总结
- 从作用域分:
- 局部变量:
- 自动变量,即动态局部变量(离开函数,值就消失)
- 静态局部变量(离开函数,值仍保留)
- 寄存器变量(离开函数,值就消失)
- 全局变量
- 静态外部变量(satic修饰的外部变量,只限于本文件使用)
- 外部变量(允许其他文件使用)
- 局部变量:
- 按存储方式分:
- 动态存储:
- 自动变量(本函数内有效)
- 寄存器变量(本函数内有效)
- 形式参数(本函数内有效)
- 静态存储:
- 静态局部变量(本函数内有效)
- 静态外部变量(本文件内有效)
- 外部变量(用extern或者不修饰,其他文件可用)
- 动态存储:
- 按存储类别(存放位置)分:
- 内存中静态存储区域:
- 静态局部变量
- 静态全局变量
- 外部变量(非静态全局变量)
- 内存中动态存储区域:自动变量和形式参数
- CPU中的寄存器:寄存器变量
- 内存中静态存储区域: