作用域-存储期
1.作用域
1.1定义
作用域:C语言中,标识符都有一定的可见范围,这些可见范围保证了标识符只能在一个有限的区域内使用,这个可见范围,被称为作用域(scope)
软件开发中,尽量缩小标识符的作用域是一项基本原则(⭐优先使用局部变量)
1.2 类别
1.函数声明作用域
在函数的声明式中定义的变量,其可见范围仅限于该声明式
2.局部作用域
在代码块中定义的变量,其可见范围从其定义处开始,到代码块结束为止
3.全局作用域
在函数外定义的变量,其可见范围可以跨越多个文件。
4.static关键字(文件作用域)
全局变量用static修饰, 那么这个变量就有文件作用域, 只能在本文件中使用
5.作用域的临时掩盖
1.3 例子
static int a=123;
int b=10;
int main(void){
int c =20;
static int d = 30;
{
int e = 40;
printf("%d%d%d%d\n", a, b, c, d);
}
printf("%d%d%d%d\n", a, b, c, d);
}
2.存储期
2.1 类别
自动存储类型:了解
auto int a=10; //这的auto一般都省略
静态存储类型
static修饰变量
1.数据存储在数据段(全局, 局部)
2.只初始化一次
3.静态全局变量,有文件作用域(只能在本文件中使用),避免名字冲突
4.生命周期:从程序启动开始到程序结束
外部存储类型
int data =123;
int main(void)
{
//extern int data; 可以省略
printf("%d", data);
}
寄存器存储类型
在定义变量前面添加register
register int a = 123;
a声明为寄存器变量, 那么就不能对a取地址 &a是错误的
2.2 例子
#include <stdio.h>
#include <stdlib.h>
//静态存储期
static int b = 321;
int c = 456;
int main(void)
{
//自动存储期----自动存储类型
auto int a = 123; //auto 可以省略
//自定义存储期
char *p = malloc(100);
free(p);
//存储类型(自动存储类型auto, 静态存储类型static, 外部存储类型extern, 寄存器存储类型register)
extern int c;
printf("%d\n", c);
register int e = 789; //使用频率非常高的变量可以用寄存器变量提高效率
printf("%d\n", e);
}
//存储类型, 作用域, 生命周期
本文来自博客园,作者:cyt2730,转载请注明原文链接:https://www.cnblogs.com/cytwjyy/p/18872281