一.变量的分类
1.分类
全局变量: 声明在函数之外的变量
局部变量: 声明函数内部的变量
块变量: 生命在语句块(大括号)中的变量
2.不同变量的特性
变量的特性分为作用域和生命周期
作用域: 变量可以在什么位置使用,什么位置不能使用,变量的作用域包含可以使用该变量的所有语句
生命周期: 变量什么时候创建,什么时候销毁
(1)全局变量
全局变量的作用域包含程序中的所有语句
为被初始化的全局变量会被自动初始化为0
全局变量的声明周期是整个程序运行期间
全局变量能不用就不用
(2)局部变量
局部变量的作用域包含它所在函数的所有语句(先声明)
局部变量的作用域是整个函数运行期间,函数被调用时创建,返回时销毁
形式参数的作用域和生命周期和局部变量一样
(3)块变量
块变量的作用域包含它所在语句块的所有语句(先声明)
块变量的声明周期是所在语句块运行期间,每次运行语句块都会产生一个新的块变量
3.变量的修饰符
变量的修饰符用于在变量声明修饰变量,改变变量的属性,修饰符属于关键字
语法:
修饰符 变量类型 变量名;
(1)auto
用来声明自动变量
所有的局部变量默认都是自动变量,全局变量不能声明为自动变量
通常都不用写
(2)static
用来声明静态变量/静态函数
静态变量会改变变量的作用域和生命周期,分为静态局部变量和静态全局变量
静态局部变量的生命周期变为整个程序运行期间,作用域还是所在函数内部
静态变量的初始化语句只会执行一次,未初始化的静态变量会被自动初始化为0
静态全局变量的生命周期还是整个程序运行期间,作用域变为只包含声明它的那个文件
C语言的函数默认为全局函数,可以在程序中任意位置调用,静态函数只能被本文件中的函数调用
非外部接口的函数可以声明为静态函数
(3)const
用来修饰不可赋值的变量,如果一个变量在声明初始化之后不希望被修改,可以声明为const
const修饰的变量应该进行初始化
const修饰的变量有可能改变,部分编译器可用scanf修改
const常用来修饰函数的形参,保证该参数在函数内部不会被修改
(4)volatile
用于修饰易变的变量,防止编译器优化
(5)extern(多文件)
用来修饰外部变量(全局),表示该变量在其他文件中定义
4.变量的重名机制
全局变量 局部变量 块变量允许重名
如果语句中使用重名的变量,实际对应的是离声明语句最近的可用的变量(就近原则)
编程的时候不要使用重名
5.程序在内存/文件中的分段
(1)代码段(text)
存放程序的语句,该段在程序运行期间大小固定,不能被修改
(2)数据段(data)
所有已初始化的全局变量和静态变量存储在该段落,该段在程序启动时分配空间,在程序运行期间大小不变
(3)bss段
所有未初始化的全局变量和静态变量存储在该段落,该段在程序启动时分配空间,会被系统自动清0,在程序运行期间大小不变
(4)堆(heap)
存放动态内存分配的空间,动态内存由程序员管理的内存
分配动态内存堆空间变大,释放动态内存堆空间变小
(5)栈(stack)
存放的是函数内部的数据(局部变量 形式参数 返回值 块变量),每个函数都在该段有一段私有区域,该段在函数被调用时变大,函数返回时变小