作用域-存储期

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);    
}

image

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);
}

image

寄存器存储类型

在定义变量前面添加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);

}
//存储类型, 作用域, 生命周期
posted @ 2025-05-12 10:48  cyt2730  阅读(7)  评论(0)    收藏  举报