C语言内部静态变量与外部静态变量的区别

当我们定义一个静态变量时,它的存储位置决定了它是内部静态变量还是外部静态变量。

内部静态变量是在函数内部定义的静态变量,它只能在定义它的函数中使用,也就是说,这个静态变量的作用域只在这个函数内部。

外部静态变量是在函数外部定义的静态变量,它可以在整个程序中使用,但是作用域仅限于定义它的文件内部。

总体而言,静态变量都有着不会随时被销毁的特点,程序真正运行的时候只会产生一次内存的分配,所以相比于普通的局部变量它们具有更长的生命周期和更加可靠的状态存储。

下面通过两个具体例子来更好地理解内部静态变量与外部静态变量的区别:

示例1: 内部静态变量

#include <stdio.h>

void my_func()
{
    static int cnt = 0; //定义一个内部静态变量cnt,并且初始化为0

    printf("The cnt is %d\n", cnt);
    cnt++;            //每次调用cnt都加1
}

int main()
{
    my_func();        //第1次调用
    my_func();        //第2次调用
    my_func();        //第3次调用

    return 0;
}

输出结果为:

The cnt is 0
The cnt is 1
The cnt is 2

通过上述程序,我们首先定义了一个内部静态变量cnt,并且初始化为0。接着我们在my_func()函数中每次调用cnt都加1。由于这里定义的是一个内部静态变量,所以cnt的值不会因为函数的结束而被销毁,而是一直存在,所以每一次调用cnt的值都会被正确地累加。

示例2: 外部静态变量

文件a.c

#include <stdio.h>

static int cnt = 0; //定义一个外部静态变量cnt,并且初始化为0

void a_func()
{
    printf("The cnt in a_func is %d\n", cnt);
    cnt++;            //每次调用cnt都加1
}

文件b.c

#include <stdio.h>

extern void a_func(); //声明外部函数a_func

void b_func()
{
    a_func();        //调用函数a_func
    a_func();        //再次调用函数a_func
    a_func();        //再次调用函数a_func
}

文件main.c

#include <stdio.h>

extern void b_func(); //声明外部函数b_func

int main()
{
    b_func();         //调用函数b_func

    return 0;
}

输出结果为:

The cnt in a_func is 0
The cnt in a_func is 1
The cnt in a_func is 2

通过上述程序,我们定义了一个外部静态变量cnt,并且初始化为0。不同于内部静态变量,外部静态变量的作用域不限于函数内部,而是作用于整个文件中。我们在文件a.c中定义了一个静态函数a_func(),打印输出变量cnt的值并加1。接着在文件b.c中再定义一个函数b_func(),该函数调用了a_func()三次。最终我们在main函数中调用b_func(),就可以看到在不同的调用中cnt的值被成功持续累加,说明外部静态变量的作用域确实是整个文件,可以被不同的函数共享使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言内部静态变量与外部静态变量的区别 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • C++中的拷贝构造详解

    C++中的拷贝构造详解 什么是拷贝构造函数 拷贝构造函数是C++类中的一种构造函数,用于创建对象的副本。当原对象被传递给一个函数或以值的方式返回时,拷贝构造函数被调用来创建一个新的对象,该新对象是原对象的一个完全拷贝。拷贝构造函数的原型通常是:ClassName(const ClassName& obj);。 在某些情况下,编译器会自动生成拷贝构造函…

    C 2023年5月22日
    00
  • c++加法高精度算法的简单实现

    C++高精度算法之加法实现 在进行高精度计算时,我们需要发挥出C++的高精度计算能力,而加法实现就是高精度计算的最基础部分。本文将探讨C++加法高精度算法的简单实现,提供完整代码和演示示例。 1. 问题描述 给定两个非负整数,输出它们的和。 2. 思路分析 我们可以使用数组来实现高精度加法。先设计一个数组用来存储每一位数字,依次相加即可。需要注意的是,进位的…

    C 2023年5月22日
    00
  • C语言常见的指针笔试题解析

    C语言常见的指针笔试题解析 什么是指针 在C语言中,指针是指向内存地址的变量。每个变量在内存中都有一个地址,而指针就是存储这个地址的变量。通过指针可以操作内存地址中的内容。 指针的声明和使用 指针的声明使用*来标记,例如: int *p; 这个声明语句表示一个指向整型变量的指针p。如果要让指针p指向某个变量的地址,可以使用&运算符: int a = …

    C 2023年5月23日
    00
  • PHP JSON格式的中文显示问题解决方法

    PHP 中 JSON 格式对于中文字符的处理方式存在一些问题,下面提供一种解决方法。 问题分析 在使用 PHP 中的 json_encode 函数将一个数组或对象转换为 JSON 字符串时,如果数组或对象中含有中文字符,那么生成的 JSON 字符串中这些中文字符会被转义成 Unicode 编码形式。 例如,以下数组: $data = [ "name…

    C 2023年5月23日
    00
  • VS Code C++环境的搭建过程

    下面是VS Code C++环境的搭建过程。 环境准备 首先需要安装以下软件:- Visual Studio Code:https://code.visualstudio.com/- MinGW:http://www.mingw.org/ 安装过程不再赘述,安装好以上软件后,我们可以开始配置VS Code C++环境。 配置C++环境 打开Visual St…

    C 2023年5月23日
    00
  • 笔记本ABCD壳怎么区分 笔记本abcd面图解介绍

    笔记本ABCD壳怎么区分:笔记本ABCD面图解介绍 为了更好地保护笔记本电脑并及时更换其配件,我们需要了解笔记本电脑的各个部分和配件。其中,笔记本电脑的ABCD壳区分,常常是困惑大家的一个问题。下面,我们将详细介绍笔记本电脑ABCD壳的区分和说明,以便更好地了解你的电脑。 什么是笔记本电脑的ABCD面? 首先,我们需要了解什么是笔记本电脑的ABCD面。ABC…

    C 2023年5月23日
    00
  • 深入解析C++中的指针数组与指向指针的指针

    深入解析C++中的指针数组与指向指针的指针 指针数组 指针数组是指以数组形式存储的指针的集合。其语法格式为: type* array_name[size]; type为指针所指向的类型,array_name为数组的名称,size为数组的大小。其中,*表示指针运算符。指针数组定义完成后,可以通过下标的方式对其进行操作。 以下是一个示例,展示如何定义和使用指针数…

    C 2023年5月23日
    00
  • sqlmap之os shell图文详细解析

    让我来详细讲解“sqlmap之os shell图文详细解析”的完整攻略。 SQLMap之OS Shell图文详细解析 什么是SQLMap SQLMap是一个用于检测和利用SQL注入漏洞的开源工具,可以自动化地进行注入测试,并且提供了多种手段来发现和利用漏洞,是渗透测试中非常实用的工具之一。SQLMap完全基于Python开发,支持Linux和Windows操…

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