一些對static與extern的用法及理解
阿新 • • 發佈:2019-01-02
static為靜態變數,初始化語句僅執行一次,不初始化則預設為0,因為靜態記憶體(堆)中所有位元組位(不知道術語是啥,反正大概就是一個位元組裡儲存的內容的意思吧)預設為0000 0000,宣告的靜態變數會在堆中開闢相應的記憶體,靜態變數與棧中的動態變數所不同的是,靜態變數不會因為函式的結束而被釋放,這一點跟全域性變數有相似之處。
靜態變數若宣告在所有函式之外,則該變數的作用域為當前檔案,其他檔案不可訪問該變數(區域性的共有變數);
若宣告在函式中,該變數的作用域則為函式內,除該函式以外的函式不可訪問該變數,且該變數不會因為函式的結束而被釋放,當下一次重新執行該函式的時候會以上一次結束時所保留的值而繼續使用,例:
int fun(){
static int i; //該語句只執行一次
printf(“%d\n”,i);
i++;
}
int main(){
//i++; 若這樣輸入則會出錯,因為沒有對i進行宣告,fun裡的i只能給fun使用
fun(); //此時打印出來的值為0
fun(); //此時打印出的值為1
}
extern全域性變數,當變數宣告在函式之外的時候會定義為全域性變數,所有檔案都可以訪問該變數並可以修改,但是隻能在一個檔案裡初始化;
注意:extern int a;只是宣告一個全域性變數,如果所有檔案都只使用extern int a;進行宣告而沒有初始化則會報錯。一般會用int a;定義,定義之後預設值為0,其他檔案引用時只需寫上extern int a;(其他檔案int a;的話部分編譯器會自動加上extern,不會報錯)即可,也可以extern int a=0;這樣來定義一個全域性變數
static變數的名字不會跟別的檔案的全域性變數名引起衝突,但是同名的情況下,該檔案內的函式會優先使用該函式內的靜態變數,如:
檔案1:
#include<stdio.h>
static int a=2;
extern int a;
void sum(int x);
int main(){
test(); //打印出的值為0
sum(3);
printf("a=%d\n",a); //打印出的值為5
return 0;
}
void sum(int x){
a += x;
}
檔案2:
#include<stdio.h> int a=0; void test(){ printf("hello.c 's a= %d\n",a); }