static
static是變量的一種屬性,表示靜態變量
生命週期:因爲靜態變量是存儲在程序靜態區,而程序的靜態區會隨着程序的開始而申請隨着程序的結束而回收,所以靜態變量的生命週期也就取決於當前程序的運行和結束時間
作用域:靜態變量的作用域取決於生命的位置,聲明全局變量時靜態變量的作用域在此文件內,聲明局部變量時靜態變量的作用域在聲明它的局部範圍內,等同於局部變量的作用域。
雖然靜態局部變量的作用域只在聲明它的局部範圍內,但它的生命週期卻等於整個程序的生命週期的,而且靜態變量只會聲明一次,所以就可以用來做一些很有意思的事
int main()
{
void f1();
for (int i = 0; i < 10; i++)
{
f1();
}
getchar();
return 0;
}
void f1()
{
static int m = 0;
printf("%d\n", m++);
}
可以看出雖然函數結束後靜態變量的作用域已經結束了,但生命週期仍然存在,而且靜態變量只會聲明一次,這樣靜態變量m隨着函數的調用就會形成一種累加的效果。
extern
跨文件訪問變量的時候需要用到extern表明我要使用的是其它文件中的變量,這樣就可以跨文件訪問變量了
//test.c
int num = 8;
//main.c
#include<stdio.h>
extern int num;
int main()
{
printf("%d",num);
getchar();
return 0;
}
運行結果:
可以看出在main.c文件中用關鍵字 ertern聲明 test.h 文件中的全局num變量後就可以直接在main.c文件中直接使用了。
因爲全局變量默認是可以多文件訪問的,如果我不想讓其它的文件訪問本文件中的全局變量可以使用static關鍵字將全局變量的作用域降級,使得它只能在當前文件中使用
//test.c
static int num = 45;
#include<stdio.h>
int main()
{
extern int num;
printf("%d",num);
getchar();
return 0;
}
這樣就可以保證本文件中的變量不會被其它文件使用了。