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

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日

相关文章

  • flex实例代码

    那么我们先来看一个基本的 flex 实例代码: <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="…

    其他 2023年4月16日
    00
  • jdgui反编译jar

    当然,我很乐意为您提供有关“使用JD-GUI反编译JAR文件”的完整攻略。以下是详细的步骤和两个示例: 1 JD-GUI反编译JAR文件 JD-GUI是一款免费的Java反编译器,可以将JAR文件转换为Java源代码。以下是使用JD-GUI反编译JAR文件的步骤: 1.1 下载和安装JD-GUI 首先,您需要下载和安装JD-GUI。您可以从JD-GUI的官方…

    other 2023年5月6日
    00
  • vue使用rem实现 移动端屏幕适配

    Vue使用rem实现移动端屏幕适配攻略 移动端屏幕适配是在不同设备上保持页面显示效果一致的重要任务之一。在Vue项目中,可以使用rem单位来实现移动端屏幕适配。下面是一个详细的攻略,包含了两个示例说明。 步骤一:设置基准字体大小 在Vue项目的入口文件(通常是main.js)中,可以通过以下代码设置基准字体大小: // main.js // 获取屏幕宽度 c…

    other 2023年9月6日
    00
  • catia软件怎么绘制画弹簧模型?

    下面我来详细讲解一下“catia软件怎么绘制画弹簧模型”这个问题的攻略。 步骤一:创建草图 首先,我们需要创建一个草图,用于基础的绘画。 打开Catia软件,选择“零件”模式。 点击“草图”图标,创建一个新草图。 根据实际需要设置草图的坐标系和平面。 在草图平面上,绘制出弹簧的轮廓线。 步骤二:绘制剖面 在完成草图的绘制后,我们需要绘制弹簧截面。这是绘制弹簧…

    other 2023年6月27日
    00
  • mysql对中文排序

    Mysql对中文排序 在进行数据库操作时,对于中文的排序问题我们经常需要遇到。Mysql作为一个流行的数据库管理系统,也提供了对中文排序的支持。本篇文章将介绍如何在Mysql中对中文进行排序,以及常见的一些问题和解决方案。 字符集 在进行排序操作之前,我们需要先了解一下字符集的概念。字符集是指计算机内部处理和存储字符的方法和规则,包括字符的编码方式以及字符的…

    其他 2023年3月28日
    00
  • win7系统电脑运行程序软件出现libeay32.dll丢失的解决方法

    题目:win7系统电脑运行程序软件出现libeay32.dll丢失的解决方法 简介 libeay32.dll是OpenSSL密码库中的一个重要的动态链接库文件,它为软件运作提供必要的支持。如果在运行软件时遇到“libeay32.dll 文件丢失”或“找不到libeay32.dll”等错误提示,那么应该按照下面的方式进行排查和处理。 解决方法 以下是几种解决方…

    other 2023年6月27日
    00
  • 欢迎加入强哥的android开发交流群

    以下是详细讲解“欢迎加入强哥的android开发交流群”的完整攻略: 步骤1:下载QQ或微信 强哥的android开发交流群是通过 QQ 或微信来进行交流的,因此,我们需要先下载并安装 QQ 或微信。 步骤2:添加强哥的QQ或微信 我们需要添加强哥的 QQ 或微信号,以便加入他的 android 开发交流群。以下是添加强哥的 QQ 或微信号的示例: QQ 号…

    other 2023年5月8日
    00
  • Spring Cloud @RefreshScope 原理及使用

    Spring Cloud @RefreshScope 原理及使用 什么是 @RefreshScope 在使用 Spring Cloud 进行应用程序开发时,我们经常会遇到一些需要在应用程序运行时更新的配置参数,比如数据库连接字符串、缓存配置等等。为了避免每次修改这些参数之后需要重启应用程序,我们可以通过使用 Spring Cloud 提供的 @Refresh…

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