【从零开始的 C 语言笔记】第二十七篇-变数的生命周期(2)

上一篇我们介绍了什麽是变数的生命周期,也介绍了区域变数、全域变数是什麽,希望大家有比较弄清楚了!

今天我们来延续上一篇提到的概念,继续看另一个变数--「静态变数」!


变数的生命周期

前一篇我们提到,变数会从被宣告的当下诞生,并且由记忆体分配一个位置给它,直到区块结束、程序结束而消失,而区域变数则是一离开所在区域则消失,全域变数则需程序结束才会消失。

接下来我们来介绍另一个有趣的变数--「静态变数」。

我们先来看一段程序码:

#include <stdio.h>

void test(int);
int main()
{
    test(3);
    test(2);

    return 0;
}

void test(int times){
    int x = 0;
    for(int i = 0; i<times; i++){
        printf("%d\n", x);
        x++;
    }
    printf("----------\n");
}

https://ithelp.ithome.com.tw/upload/images/20211129/20142565KvzhrxiifD.png
看得出这是一个副函式内,宣告了一个的区域变数,随着每次进入副函式而重新宣告,而离开副函式会消亡。

但若今天将副函式中的变数改为静态变数的话:

#include <stdio.h>

void test(int);
int main()
{
    test(3);
    test(2);

    return 0;
}

void test(int times){
    static int x = 0;
    for(int i = 0; i<times; i++){
        printf("%d\n", x);
        x++;
    }
    printf("----------\n");
}

https://ithelp.ithome.com.tw/upload/images/20211129/201425658siGMVKUqO.png
可以看到这个结果与上一次是大大的不相同了,离开副函式後静态变数并不会消失,而是保存下来直到下一次使用,所以我们才能看到第二次呼叫副函式时,变数延续了上次呼叫的改变的数值,而这就是静态变数最为不同的地方。


静态变数的使用

  1. 基本介绍
    一般来说我们平常宣告的区域变数,都是属於自动变数,即随着宣告区域决定生命周期的变数;但我们也能将区域变数加上「static」变成静态变数,使得它的生命周期改变,从使得该变数从宣告变数的当下开始,直到程序结束而消失,可以如同全域变数一般的长久存在。

如果对於变数比较与更详细介绍有兴趣的朋友,可以参考以下这个连结
痞客邦-C 语言:关於变数的二三事

  1. 宣告方法
    其实就如同一般变数的宣告方式(如果对於变数宣告有疑惑可以参考第六篇),只是我们在最前面加上了「static」,就可以宣告它为静态变数。
    https://ithelp.ithome.com.tw/upload/images/20211129/20142565XJnkAy8IvA.png

  2. 实际应用

#include <stdio.h>

void countNumber(int);
int main()
{
    int input = 0;

    printf("新增人次: ");
    while(scanf("%d", &input)!=EOF){
        countNumber(input);
        printf("新增人次: ");
    }

    return 0;
}

void countNumber(int num){
    static int total = 0;

    total = total+num;
    printf("乐园累积旅游人次: %d\n\n", total);
}

https://ithelp.ithome.com.tw/upload/images/20211129/20142565W3a8ePoe4y.png


小结

  1. 静态变数的生命周期由第一次宣告开始,直到程序结束而一起消失。

  2. 宣告静态变数时,只要在变数宣告最前面加上static。

  3. 由於静态变数由第一次宣告就一直存在,所以若初始化变数於宣告的同时,数值便不会再次初始化,而是保持变化後的数值。

  4. 当区域变数没有特别宣告为静态变数时会为自动变数,会自动决定生命周期。


看到这里我们就学完变数的概念了,如果有疑惑可以再看看之前的第六篇、上一篇等等,或上网看看更详细的资料!

下一篇我们来看看变数的延伸--「Struct」!


<<:  夜间模式真的对眼睛比较好吗? 详细整理(下)

>>:  纯Javascript,使用new Date()制作date picker

Day 19 不得不变的学习方式

事情在好起来之前,总会先变很坏,然後才会慢慢的变好。在经历这些过程後,记得要把失去的补回来,把得到的...

[iT铁人赛Day20]JAVA学习心得

做完了这几天的JAVA分享。。。我说是分享啦,因为我没有厉害到可以教别人 恩,所以做完分享之後,我也...

Day 18 : 案例分享(6.1) 人事、差勤与薪资 - 人事招募

案例说明及适用场景 所有的公司都需要人事、薪资及差勤,但大部份的系统都独立在外 一方面是人资系统确实...

[DAY-26] 做有意义的事,不要便宜行事 / 说实话,或至少不要说谎

做有意义的事,不要便宜行事 Pursue what is meaningful (not what...

[DAY 30]铁人赛完赛结语

今天是铁人赛最後一天 我把之前所整理的资料来源一并附上 有些功能其实已经想好大概怎麽实现了,但在30...