轉載:http://blog.csdn.net/king_jie0210/article/details/56277383
在C語言中,static與extern的用法
(1)修飾局部變量
a.一般情況下,對於局部變量是存放在棧區的,並且局部變量的生命週期在該語句塊執行結束時便結束了。但是如果用static進行修飾的話,該變量便存放在靜態數據區,其生命週期一直持續到整個程序執行結束;
b.對靜態局部變量是在編譯時賦初值的,即只賦初值一次,在程序運行時它已有初值。以後每次調用函數時不再重新賦初值而是保留上次函數調用結束時的值;
c.如果在定義局部變量時不賦初值的話,對靜態局部變量來說,編譯時自動賦初值0(對數值型變量)或空字符(對字符變量)。而對自動變量來說如果不賦初值則它的值是一個不確定的值;
d.雖然靜態局部變量在函數調用結束後仍然存在,但其他函數不能引用它。
什麼情況下需要用局部靜態變量呢?
a.需要保留函數上一次調用結束時的值;
eg:
#include<stdio.h>
void fun()
{
static int a=1; a++;
printf("%d\n",a);
}
int main(void)
{
fun();
fun();
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
程序執行結果爲: 2 3
說明在第二次調用fun()函數時,a的值爲2,並且沒有進行初始化賦值,直接進行自增運算,所以得到的結果爲3.
b.如果初始化後,變量只引用而不改變其值,則這時用靜態局部變量比較方便,以免每次調用時重新賦值
(2)修飾全局變量
static修飾全局變量只能在本文件中使用。如果一個全局變量,它既可以在本源文件中被訪問到,也可以在同一個工程的其它源文件中被訪問就需要用到extern.
eg:
file1.c
int a=1;
file2.c
#include
extern int a;
int main(void)
{
printf("%d\",a);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
則執行結果爲 1
但是如果在file1.c中把int a=1改爲static int a=1;
那麼在file2.c是無法訪問到變量a的。原因在於用static對全局變量進行修飾其作用域僅侷限於本文件。
(3)內部函數和外部函數
用static修飾函數稱爲靜態函數(也叫內部函數),對函數的作用域僅侷限於本文件。這樣不同的人編寫不同的函數時不用擔心自己定義的函數是否會與其它文件中的函數同名,因爲同名也沒關係
eg:
a.c
static int i;//只在a.c中可用
int j;//工程裏用
static int funA() //只在a.c中可用
{
}
int funB()//工程裏用
{
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
用extern修飾函數稱爲外部函數,可供其他文件調用。函數首部可以寫爲
extern int fun(int a,int b)
- 1
- 1
這樣函數fun就可以爲其他文件調用。C語言規定,如果在定義函數時省略extern,則隱含爲外部函數
- 頂
- 0