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日

相关文章

  • Android Drawable代码编写的新姿势分享

    这里是完整的Android Drawable代码编写的新姿势的攻略。 什么是Android Drawable? 在Android中,Drawable是一个用于定义可绘制的图形对象的抽象类。Drawable可以用作背景、图标等UI元素,它提供了各种绘制操作。Android中的Drawable大致可以分为以下几类: BitmapDrawable(bitmap) …

    other 2023年6月26日
    00
  • 星外虚拟主机管理平台 3.5重要更新说明

    星外虚拟主机管理平台3.5重要更新说明 本次更新主要更新了星外虚拟主机管理平台的许多功能和优化了用户体验,以下是本次更新的详细内容。 功能更新 新增模板管理功能 新增加了模板管理功能,即可以自定义网站模板,在线编辑代码。 使用方法:登录星外虚拟主机管理平台后,在左侧导航栏的“网站管理”菜单下,选择“模板管理”,即可进入模板管理页面。在此页面,您可以选择现有模…

    other 2023年6月27日
    00
  • opencv学习笔记07addweighted()函数

    下面是关于“opencv学习笔记07addweighted()函数”的完整攻略: 1. addWeighted()函数说明 addWeighted()函数是OpenCV中的函数,用于将两个图像进行加权融合。该函数可以用于图像叠加、图像混合、图像融合等应用场景。 addWeighted()函数的语法如下: cv2.addWeighted(src1, alpha…

    other 2023年5月7日
    00
  • 详细谈谈MYSQL中的COLLATE是什么

    MySQL中的COLLATE用于指定字符集的排序规则。简单地说,COLLATE规定了字符在排序、比较时的顺序。 在MySQL中,常见的字符集有utf8、utf8mb4、gbk等,在每个字符集下,都有多种COLLATE可供选择。一般来说,同一字符集下COLLATE的名称会有一定规律,如utf8字符集下,常见的COLLATE有utf8_general_ci、ut…

    other 2023年6月27日
    00
  • javascriptdom编程艺术

    JavaScript DOM编程艺术 什么是DOM? DOM( Document Object Model )是指文档对象模型,它是HTML和XML文档的一个对象表示,提供了一种结构化的方式来操作页面内容。在DOM树中,每个HTML元素都是一个节点,节点可以是元素节点、文本节点、属性节点等等。通过DOM API,我们可以对这些节点进行创建、删除、操作等操作。…

    其他 2023年3月29日
    00
  • CentOS关于quota的总结与实践详解

    CentOS关于quota的总结与实践详解 什么是quota quota是一种磁盘空间配额限制机制,可以限制用户或组在使用磁盘空间时的上限。CentOS是一种常见的Linux操作系统,其内置了quota软件包,可以实现对用户或组的配额限制。 安装quota软件包 在CentOS中安装quota软件包十分简单,执行以下命令即可: yum install -y …

    other 2023年6月27日
    00
  • html5页面结构_动力节点Java学院整理

    HTML5页面结构攻略 HTML5是一种用于构建网页结构的标记语言。在本攻略中,我们将详细讲解HTML5页面结构的基本要素和示例说明。 1. 文档类型声明 在HTML5中,我们使用以下文档类型声明来指定文档类型: <!DOCTYPE html> 这个声明告诉浏览器当前文档是基于HTML5标准编写的。 2. 页面结构 HTML5引入了一些新的语义化…

    other 2023年9月6日
    00
  • vmwareworkstationpro15forwindows下载与安装

    VMware Workstation Pro 15 for Windows 下载与安装 VMware Workstation Pro是一款功能强大的虚拟机软件,其能够在一台物理计算机上运行多个虚拟机操作系统,并且这些操作系统可以在一个页面通过电脑内存来交替运行。在本文中,我们将介绍如何下载 VMware Workstation Pro 15 for Wind…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部