C語言----變量生存期(高階篇三十八)


  變量的生老病死

    所有變量都占着內存,變量什么時候開始占着內存,什么時候從內存中消失,這叫做變量的生存周期。

      按照變量的生存周期分類有:

        ※自動變量auto

        ※靜態變量static

        ※寄存器變量register

        ※外部變量extern

 

        ※函數也有外部函數extern和靜態函數static兩種

  變量作用域

    有時候變量還未消亡,你卻不能使用它,這就是變量作用域在作怪。

    按照變量作用域分局部變量和全局變量。它們沒有什么關鍵字修飾,只是看你在什么部位定義變量。

    從變量生存期和作用域來分析幾種不同種類變量的特性。

  局部變量

    定義局部變量的關鍵字為auto,也叫自動變量。

    C語言規定自動變量在定義時前面的auto可以省略。

      如:int a;   等價於  auto int a;

  全局變量

    在函數外面定義的變量都是全局變量,不管它用什么關鍵字修飾。

    全局變量的特點:

      ※全局變量的生存期和作用域在從它的定義點開始,一直到本文件的程序結束前,都是有效的,程序結束后消亡,釋放內存。

      ※全局變量作用域中的所有函數將共享這個全局變量中的內存數據,各函數之間也可以通過全局變量傳送數據,但在職業程序員中,這是種很不好的習慣。

    注意:在同一作用域中,如果局部變量與全局變量重名,全局變量將暫時退居幕后,這時只能操作局部變量。

 

    程序1

      局部變量和全局變量

// 38-1變量生存期.c

#include <stdio.h>

int a = 1, b = 2;     //全局變量

void fun(int c,int d)
{
    int a = 3, b = 4;    //局部變量與全局變量重名,隱藏全局變量
    auto int e = 5;      //自動局部變量  int e = 5; 相等
    int f = 6;    //局部變量
    printf("在fun函數中使用局部變量:c = %d\n", c);
    printf("在fun函數中使用局部變量:e = %d\n", e);
    printf("在fun函數中使用全局變量:a = %d\n", a);


}


int g = 10, h = 11;   //全局變量
main()
{
    int i = 12, j = 13;  //局部變量
    fun(i, h);
    printf("在main函數中使用全局變量:a = %d\n", a);
    printf("在main函數中使用全局變量:g = %d\n", g);

}

 

  靜態變量

    靜態變量在程序執行點離開它的作用域時,它並不消亡,它還會死霸着那片內存不放,等着你別的函數下次來使用它。與全局變量不同的是:靜態變量通常在函數內部定義,而全局變量只能在函數外部定義。它們的共同點是:在程序結束時,它們都會消亡。   

    程序2

      靜態變量

// 38-2靜態變量static.c
//

#include <stdio.h>
void fun()
{
    static int i = 0;   //靜態局部變量    一直占用內存區
    int a = 0;            //局部變量
    i++;
    a++;
    printf("靜態變量值:i = %d\n,自動變量值:a = %d\n", i, a);
}

main()
{
    fun();
    fun(); 
    fun();
}

  寄存器變量

    寄存器變量不放在內存中,直接放在CPU寄存器中。因為CPU中的寄存器數量有限,所以寄存器變量不能設置太多。

    寄存器變量的特點是:比普通內存速度快上百倍。

  外部變量

    如果一個文件要使用其它文件中的全局變量,就要使用extern聲明,這樣它就可以和其它文件共享此變量。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM