变量的作用域与存储类
1、变量的作用域
1.1、作用域
- 所谓
作用域
就是变量的有效范围
1.2、局部变量
-
定义:在
复合语句内部
或函数内部
定义的变量称为局部变量
-
局部变量作用域:自定义位置起,到
符合语句
或函数
的结束 -
在不同作用域内变量名可以重名
-
内部与外部变量同名,
内部变量优先
(就近原则)int main(){ int a=3,b=0; { int a=5; b+=a; } b*=a; printf("%d\n",b); return 0; } 输出结果:15
1.3、全局变量
- 定义:自
函数外部
定义的变量称为全局变量
- 作用域:自定义位置起,到
整个程序的结束
int a=3;
int main(){
int s=0;
{
int a=5;
s+=a++;
}
s+=a++;
printf("%d\n",s);
return 0;
}
输出结果:8
2、变量的存储类
2.1、自动型(auto)
-
函数中的
局部变量
,默认
都是动态
分配存储空间的 -
在
调用
该函数时系统会给这些变量分配
存储空间 -
函数
调用结束
时就自动释放
存储空间 -
这类局部变量称为自动变量,用关键字auto作存储类别声明
auto int a; (可省略)存储类 类型名 变量名
2.2、寄存器型(register)
- 用register声明的变量是寄存器变量,是存放在
CPU
的寄存器里的。而我们平时声明的变量是存放在内存中的。虽说内存的速度已经很快了,不过跟寄存器比起来还是差得远。
2.3、静态型(static)
-
静态局部变量
的值在函数调用结束后不消失
,而保留原值,即其占用的存储单元不释放
-
仅允许当前文件使用
int fun(int n){ static int s=2; s+=n; return s; } int main{ int x=2; printf("%d\n",fun(x)); printf("%d\n",fun(x)); return 0; } 输出结果: 4 6
2.4、总结
- auto自动型:
默认
的类型 - register:寄存器型
- static:静态型、内部变量、内部函数,仅允许当前文件使用
- extern:外部变量、外部函数允许其它文件使用
3、动态存储方式与静态存储方式
- 从变量值的生存期角度划分,可以分为
静态
存储方式和动态
存储方式- 静态:整个程序
- 动态:函数调用结束
- 静态区:变量类型
- 静态局部变量
- 全局变量或外部变量
- 初始化在
编译
阶段、初值为0
- 动态区:变量类型
- 动态变量