全國(guó)計(jì)算機(jī)二級(jí)考試輔導(dǎo):C語(yǔ)言之函數(shù)(5)

字號(hào):

靜態(tài)存儲(chǔ)變量通常是在變量定義時(shí)就分定存儲(chǔ)單元并一直保持不變, 直至整個(gè)程序結(jié)束。5.5.1節(jié)中介紹的全局變量即屬于此類存儲(chǔ)方式。動(dòng)態(tài)存儲(chǔ)變量是在程序執(zhí)行過(guò)程中,使用它時(shí)才分配存儲(chǔ)單元, 使用完畢立即釋放。 典型的例子是函數(shù)的形式參數(shù),在函數(shù)定義時(shí)并不給形參分配存儲(chǔ)單元,只是在函數(shù)被調(diào)用時(shí),才予以分配, 調(diào)用函數(shù)完畢立即釋放。如果一個(gè)函數(shù)被多次調(diào)用,則反復(fù)地分配、 釋放形參變量的存儲(chǔ)單元。從以上分析可知, 靜態(tài)存儲(chǔ)變量是一直存在的, 而動(dòng)態(tài)存儲(chǔ)變量則時(shí)而存在時(shí)而消失。我們又把這種由于變量存儲(chǔ)方式不同而產(chǎn)生的特性稱變量的生存期。 生存期表示了變量存在的時(shí)間。 生存期和作用域是從時(shí)間和空間這兩個(gè)不同的角度來(lái)描述變量的特性,這兩者既有聯(lián)系,又有區(qū)別。 一個(gè)變量究竟屬于哪一種存儲(chǔ)方式, 并不能僅從其作用域來(lái)判斷,還應(yīng)有明確的存儲(chǔ)類型說(shuō)明。
    在C語(yǔ)言中,對(duì)變量的存儲(chǔ)類型說(shuō)明有以下四種:
    auto     自動(dòng)變量
    register   寄存器變量
    extern    外部變量
    static    靜態(tài)變量
    自動(dòng)變量和寄存器變量屬于動(dòng)態(tài)存儲(chǔ)方式, 外部變量和靜態(tài)變量屬于靜態(tài)存儲(chǔ)方式。在介紹了變量的存儲(chǔ)類型之后, 可以知道對(duì)一個(gè)變量的說(shuō)明不僅應(yīng)說(shuō)明其數(shù)據(jù)類型,還應(yīng)說(shuō)明其存儲(chǔ)類型。 因此變量說(shuō)明的完整形式應(yīng)為: 存儲(chǔ)類型說(shuō)明符 數(shù)據(jù)類型說(shuō)明符 變量名,變量名…; 例如:
    static int a,b;           說(shuō)明a,b為靜態(tài)類型變量
    auto char c1,c2;          說(shuō)明c1,c2為自動(dòng)字符變量
    static int a[5]={1,2,3,4,5};    說(shuō)明a為靜整型數(shù)組
    extern int x,y;           說(shuō)明x,y為外部整型變量
    下面分別介紹以上四種存儲(chǔ)類型:
    一、自動(dòng)變量的類型說(shuō)明符為auto。
    這種存儲(chǔ)類型是C語(yǔ)言程序中使用最廣泛的一種類型。C語(yǔ)言規(guī)定, 函數(shù)內(nèi)凡未加存儲(chǔ)類型說(shuō)明的變量均視為自動(dòng)變量, 也就是說(shuō)自動(dòng)變量可省去說(shuō)明符auto。 在前面各章的程序中所定義的變量凡未加存儲(chǔ)類型說(shuō)明符的都是自動(dòng)變量。例如:
    { int i,j,k;
    char c;
    ……
    }等價(jià)于: { auto int i,j,k;
    auto char c;
    ……
    }
    自動(dòng)變量具有以下特點(diǎn):
    1. 自動(dòng)變量的作用域僅限于定義該變量的個(gè)體內(nèi)。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效。在復(fù)合語(yǔ)句中定義的自動(dòng)變量只在該復(fù)合語(yǔ)句中有效。 例如:
    int kv(int a)
    {
    auto int x,y;
    { auto char c;
    } /*c的作用域*/
    ……
    } /*a,x,y的作用域*/
    2. 自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式,只有在使用它,即定義該變量的函數(shù)被調(diào)用時(shí)才給它分配存儲(chǔ)單元,開(kāi)始它的生存期。函數(shù)調(diào)用結(jié)束,釋放存儲(chǔ)單元,結(jié)束生存期。因此函數(shù)調(diào)用結(jié)束之后,自動(dòng)變量的值不能保留。在復(fù)合語(yǔ)句中定義的自動(dòng)變量,在退出復(fù)合語(yǔ)句后也不能再使用,否則將引起錯(cuò)誤。例如以下程序:
    main()
    { auto int a,s,p;
    printf("\ninput a number:\n");
    scanf("%d",&a);
    if(a>0){
    s=a a;
    p=a*a;
    }
    printf("s=%d p=%d\n",s,p);
    }
    s,p是在復(fù)合語(yǔ)句內(nèi)定義的自動(dòng)變量,只能在該復(fù)合語(yǔ)句內(nèi)有效。而程序的第9行卻是退出復(fù)合語(yǔ)句之后用printf語(yǔ)句輸出s,p的值,這顯然會(huì)引起錯(cuò)誤。
    3. 由于自動(dòng)變量的作用域和生存期都局限于定義它的個(gè)體內(nèi)( 函數(shù)或復(fù)合語(yǔ)句內(nèi)), 因此不同的個(gè)體中允許使用同名的變量而不會(huì)混淆。 即使在函數(shù)內(nèi)定義的自動(dòng)變量也可與該函數(shù)內(nèi)部的復(fù)合語(yǔ)句中定義的自動(dòng)變量同名。例5.14表明了這種情況。
    [例5.14]
    main()
    {
    auto int a,s=100,p=100;
    pri
    ntf("\ninput a number:\n");
    scanf("%d",&a);
    if(a>0)
    {
    auto int s,p;
    s=a a;
    p=a*a;
    printf("s=%d p=%d\n",s,p);
    }
    printf("s=%d p=%d\n",s,p);
    }
    本程序在main函數(shù)中和復(fù)合語(yǔ)句內(nèi)兩次定義了變量s,p為自動(dòng)變量。按照C語(yǔ)言的規(guī)定,在復(fù)合語(yǔ)句內(nèi),應(yīng)由復(fù)合語(yǔ)句中定義的s,p起作用,故s的值應(yīng)為a a,p的值為a*a。退出復(fù)合語(yǔ)句后的s,p 應(yīng)為main所定義的s,p,其值在初始化時(shí)給定,均為100。從輸出結(jié)果可以分析出兩個(gè)s和兩個(gè)p雖變量名相同, 但卻是兩個(gè)不同的變量。
    4. 對(duì)構(gòu)造類型的自動(dòng)變量如數(shù)組等,不可作初始化賦值。