C 语言学习笔记01:变量存储方式和存储类别
- 存储方式
C语言按照变量的生命周期可以分为静态存储方式和动态存储方式两种。
- 静态存储方式
静态存储方式是指程序许在运行期间分配固定的存储空间的方式。静态存储区中存放了程序在整个运行过程中都存在的变量,如全局变量。 - 动态存储方式
动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数、自动变量、函数调用时的现场保护和返回地址等。
- 静态存储方式
存储类别
C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。auto
用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。如:auto int a; //定义自动变量 a
static
用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量。如下为静态局部变量:#include <stdio.h> void fun() { static int x = 0; //定义静态局部变量 x x++; printf("fun:x=%d\n",x); } int main() { int i; for(i=0;i<10;i++) { fun(); } return 0; } 结果: fun:x=1 fun:x=2 fun:x=3 fun:x=4 fun:x=5 fun:x=6 fun:x=7 fun:x=8 fun:x=9 fun:x=10
注意:
静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;
静态局部变量在编译时赋初值,即只赋初值一次;
如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。register
为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。例如:void fun() { register int x; //定义寄存器类型变量 x }
注意:
只有局部自动变量和形式参数可以作为寄存器变量;
一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;
局部静态变量不能定义为寄存器变量。extern
用extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量。如:#include<stdio.h> int main() { extern int x; //此处声明的变量 x 为调用外部全局变量 printf("extern x=%d\n",x); return 0; } int x = 100;