iT邦幫忙

0

【從零開始的 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」!


尚未有邦友留言

立即登入留言