1. 程式人生 > >靜態(static)全域性變數與全域性變數,靜態區域性變數與區域性變數,內部(static)函式與普通函式

靜態(static)全域性變數與全域性變數,靜態區域性變數與區域性變數,內部(static)函式與普通函式

(1)static全域性變數和普通全域性變數的區別

主要是作用域使用範圍的區別
static/靜態全域性變數作用域有限,侷限在一個原始檔內(定義它的原始檔),不能被同一源程式的其他原始檔使用,避免引起錯誤。(因而同名靜態全域性變數可以被定義在不同原始檔中,使用關鍵字static)
普通全域性變數作用域是整個源程式,可以被源程式中的各個原始檔所使用(關鍵字extern)。

(2)static區域性變數和普通區域性變數的區別

根本區別在於生命週期不同
靜態區域性變量雖然屬於區域性變數但生命週期延續到整個程式結束,即使不在作用域範圍,程式也會保留其記憶體空間,不會消失。類似全域性變數,只是作用域更小。因而在第一次初始化之後,變數將一直存在

,每次進入呼叫範圍將延續之前的值,無需在重新定義和初始化。
區域性變數生命週期侷限於定義和使用它的程式段,當不在作用域範圍時,記憶體消失,因而每次進入呼叫範圍需要重新定義和初始化

#include<iostream>
using namespace std;
int staticInitTest(int t){
    static int a=t;//整個程式中靜態區域性變數的初始化語句只執行一次。
    cout<<a;
}
int main(){
    int i=5;
    while(i--){
        staticInitTest(i);
    }
    return
0; }//執行結果: 44444
#include<iostream>
using namespace std;
int staticInitTest(int t){
    int a=t;//區域性變數,每次進入需要重新定義
    cout<<a
}
int main(){
    int i=5;
    while(i--){
        staticInitTest(i);
    }
    return 0;
}
//執行結果:
43210

(3)static函式和普通函式的區別

區別在於作用域和記憶體不同
static函式,即內部函式,只在當前原始檔中使用,並且在記憶體中只有一份。
普通函式

即預設為全域性函式,經過include其所在原始檔和函式宣告,可以在原始檔外使用,在每次呼叫時都會拷貝一份。