1.变量的分类:
1.1块变量
语句块(程序块):指使用大括号{}括起来的一组语句在一个语句块内部的变量,叫做块变量
if(...)
{
int i;//块变量
}
(1)生命周期:
从定义开始,一直到程序块结束
(2)作用域(访问范围):只有在语句块的内部访问
1.2 局部变量
在函数内部定义的变量叫做局部变量,局部如果没有进行初始化的话,那么这个变量的值是一个随机数void fn(void)
{
int a;
}
(1) 生命周期:从定义开始,一直到函数结束
(2)作用域:从定义开始之后的整个函数内部可以访问
1.3静态局部变量
使用关键字static 修饰的局部变量void fn (void)
{
static int a;
}
(1)生命周期:整个程序
(2)作用域:和普通局部变量一样
(3)作用:一般可以用于计数,只要程序不结束,可以实现不停的累加
扩展:
static 关键字还可以修饰全局变量和函数,表示这个变量和函数只能在当前文件中使用
1.4全局变量
定义在整个程序内部的变量,一般都定义在程序的开头位置,或者头文件,全局变量会被自动初始化为0;(1)生命周期:定义开始,一直到整个程序结束
(2)作用域: 定义开始,在整个程序内部都可以访问
例子:
使用全局变量模拟一下栈的基本操作:入栈,出栈,栈是否为空,是否满
全局变量的缺点:
(1)维护起来比较困难,
(2)排错困难;
(3)代码复用困难;
1.5不同范围内的同名变量
如果全局变量、局部变量以及块变量同名,那么在块变量范围内,块变量优先;在局部变量范围内,局部变量优先,最后才轮到全局变量——》局部优先法则
练习:编写一个程序实现动态显示系统时间
time(0) sleep()
2.程序在内存区域中的划分:
(1)程序段: 用来存放程序的代码,程序段是只读的(2)数据段:用来存放的已经初始化的全局变量和静态局部变量
(3)BSS段:用来存放没有进行初始化的全局变量,自动初始化为0
(4)堆区: 用来进行动态内存的分配(malloc/ calloc/realloc/free)
(5) 栈区:操作系统自动进行内存的分配和回收,一般存放局部变量
3.修饰变量的关键字
3.1 auto:自动变量(一般省略,默认就是)
一般的局部变量(除static)都是自动变量,一般省略,默认情况下都是自动变量signed 一般都省略,默认就是
3.2 static
修饰局部变量:静态局部变量,表示这个变量的生命周期为整个程序,一般用于计数,修饰全局变量:变量只能在本文件中使用,
修饰函数: 表示这个函数只能在本文件中使用
3.3 register:寄存器
修饰的变量叫寄存器变量,告诉编译器,这个变量我会频繁使用,请保存在寄存器中,因为读取寄存器中数据的速度比内存快;使用限制:
(1)必须能被CPU的寄存器接受,
(2)不能对寄存器中的变量取地址,
(3)有些系统并不会把这种变量放在寄存器中,主要取决于编译器