C语言:变量的作用域和生命周期详解

yizhihongxing

C语言:变量的作用域和生命周期详解

变量的作用域

变量的作用域指的是变量在程序中可被访问的范围,C 语言中有如下几种作用域:

  1. 文件作用域(全局作用域):在函数外部声明的变量拥有文件作用域,文件作用域的变量可以被文件中所有函数访问。使用关键字static 修饰的文件作用域变量只能在当前文件内可见。

    ```
    / 文件 foo.c /
    int global_i; // 全局变量,有文件作用域
    static char static_j; // 局部静态变量,有文件作用域

    void func1(){
    / 代码 /
    }

    void func2(){
    / 代码 /
    }
    ```

  2. 函数作用域(局部作用域):在函数内部声明的变量拥有函数作用域,函数作用域的变量只可在函数内部访问。

    ```
    void foo(){
    int local_i; // 局部变量,有函数作用域
    static float static_k; // 局部静态变量,有函数作用域

    /* 代码 */
    

    }
    ```

  3. 块作用域:在代码块内部(比如循环、条件语句等块级作用域)声明的变量拥有块作用域,块作用域变量只能在代码块内部访问。

    ```
    void foo(){
    for(int i=0; i<10; i++){
    int local_i; // 块变量,有块作用域
    / 代码 /
    }

    if(1<2){
        int local_j; // 块变量,有块作用域
        /* 代码 */
    }
    

    }
    ```

变量的生命周期

变量的生命周期指的是变量的存在时间,C 语言中的变量有以下生命周期:

  1. 静态存储期:静态存储期的变量使用关键字static修饰,在编译时就被分配内存,在程序运行时一直存在,直至程序结束。

    ```
    / 静态存储期变量 /
    static int static_var;

    int main(){
    / 代码 /
    return 0;
    }
    ```

  2. 线程存储期:线程存储期的变量使用关键字_Thread_local修饰,每个线程都有一个该变量的独立实例,直至线程结束。

    ```
    / 线程存储期变量 /
    _Thread_local int thread_var;

    int main(){
    / 代码 /
    return 0;
    }
    ```

  3. 自动存储期:自动存储期的变量是在函数内或者代码块内定义的非静态变量,它们在函数或者代码块被调用时创建,在函数或者代码块结束时销毁。

    ```
    void foo(){
    / 自动存储期变量 /
    int auto_var;

    /* 代码 */
    

    }
    ```

  4. 动态存储期:动态存储期的变量使用malloc()等分配内存的函数动态分配内存,使用free()等函数释放内存,存在时间由程序员手动控制。

    ```
    int main(){
    / 动态存储期变量 /
    int dynamic_var = (int )malloc(sizeof(int));

    /* 代码 */
    
    free(dynamic_var);
    
    return 0;
    

    }
    ```

示例说明

示例 1

#include <stdio.h>

int global_i = 10; // 全局变量

void func(){
    int local_i = 5; // 函数作用域变量
    printf("local_i = %d\n", local_i);
}

int main(){
    /* 代码块作用域 */
    for(int i=0; i<2; i++){
        int block_i = i; // 块作用域变量
        printf("block_i = %d\n", block_i);
    }

    func();

    printf("global_i = %d\n", global_i);

    return 0;
}

输出:

block_i = 0
block_i = 1
local_i = 5
global_i = 10

示例 2

#include <stdio.h>

int main(){
    /* 静态存储期变量 */
    static int static_var = 5;

    /* 线程存储期变量 */
    _Thread_local int thread_var = 10;

    /* 自动存储期变量 */
    int auto_var = 20;

    /* 动态存储期变量 */
    int *dynamic_var = (int *)malloc(sizeof(int));
    *dynamic_var = 30;

    printf("static_var = %d\n", static_var);
    printf("thread_var = %d\n", thread_var);
    printf("auto_var = %d\n", auto_var);
    printf("*dynamic_var = %d\n", *dynamic_var);

    free(dynamic_var);

    return 0;
}

输出:

static_var = 5
thread_var = 10
auto_var = 20
*dynamic_var = 30

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言:变量的作用域和生命周期详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Win10系统桌面图标布局很乱的四种解决方法

    以下是“Win10系统桌面图标布局很乱的四种解决方法”的详细攻略: 一、手动调整图标位置 通常情况下,Win10系统桌面图标布局不是很整齐,可以通过手动调整图标位置实现布局的规整。具体操作步骤如下: 鼠标右键点击桌面空白处,选择“查看”,勾选“对齐图标到网格”。 鼠标左键点击要移动的图标,不松开鼠标,将图标拖拽到目标位置即可。 需要注意的是,手动调整图标位置…

    other 2023年6月26日
    00
  • 微信小程序上线发布具体流程简析

    当一个微信小程序开发完成后,需要进行上线发布才能让用户使用。下面是微信小程序上线发布的具体流程简析: 第一步:注册小程序账号 在微信公众平台注册一个小程序账号。具体步骤可以参考微信公众平台的注册指引和文档。 第二步:进入小程序管理后台 在小程序账号注册成功后,进入小程序管理后台。在后台中进行开发者认证,认证需要提供开发者姓名、手机号码和个人身份证。 第三步:…

    other 2023年6月26日
    00
  • Android自定义Style实现方法

    Android自定义Style是一种页面UI风格的定制与重用方式,通过继承Android默认样式和修改其中的属性值,可以快速定制自己的UI风格。下面是Android自定义Style的完整攻略: 1. 创建Style 在res/values/styles.xml中创建自定义style,通过“parent”属性来继承自Android默认样式,然后修改其中需要修改…

    other 2023年6月25日
    00
  • MySQL中大数据表增加字段的实现思路

    MySQL中大数据表增加字段的实现思路主要包括以下几步: 1.备份数据:在进行任何数据库操作之前,必须先备份数据库,以避免意外情况造成数据丢失。 2.创建新字段:使用ALTER TABLE语句添加新的字段。具体语法如下: ALTER TABLE table_name ADD COLUMN column_name datatype; 其中,table_name…

    other 2023年6月25日
    00
  • namedtuple

    使用Python中的namedtuple Python的collections模块提供了一种称为namedtuple的数据类型。namedtuple是一个函数,它相当于定义一个具有预定义字段名称的简单类。 namedtuple的使用方法与一般的元组十分相似,但是它们更加符合面向对象的思想。使用namedtuple,您可以将您的元组类型转化为Python中的数…

    其他 2023年3月28日
    00
  • 【用户不在sudoers文件中】问题解决

    当用户在 Linux 系统中执行需要管理员权限的命令时,可能会遇到“用户不在sudoers文件中”的错误。这是因为该用户没有被授权执行 sudo 命令的权限。本文将提供两种解决问题的方法,并提供示例说明。 方法一:将用户添加到 sudoers 文件中 sudoers 文件是 Linux 系统中用于授权用户执行 sudo 命令的文件。可以通过编辑该文件,将用户…

    other 2023年5月9日
    00
  • 从头学习C语言之for语句和循环嵌套

    从头学习C语言之for语句和循环嵌套攻略 1. for语句的基本语法 for语句是C语言中最常用的循环结构之一,它可以重复执行一段代码块,直到满足指定的条件为止。for语句的基本语法如下: for (初始化表达式; 循环条件; 更新表达式) { // 循环体 } 其中,初始化表达式用于初始化循环变量,循环条件是一个逻辑表达式,当其为真时循环继续执行,更新表达…

    other 2023年7月28日
    00
  • windows11怎么显示文件后缀名? win11显示后缀名的两种方法

    在Windows 11中,你可以通过以下两种方法来显示文件的后缀名: 方法一:使用文件资源管理器 打开文件资源管理器。你可以通过点击任务栏上的文件夹图标或者按下Win + E快捷键来打开。 在文件资源管理器中,点击顶部菜单栏的\”查看\”选项。 在\”查看\”选项卡中,找到\”文件名扩展名\”这一栏。 确保\”文件名扩展名\”的复选框是选中状态。如果没有选中…

    other 2023年8月5日
    00
合作推广
合作推广
分享本页
返回顶部