每天拾一個C語言貝殼,厚積薄發,積跬步以致千裡。
今日貝殼:C語言static的用法與static修飾變量的空間存儲特征。
要點: static在C中主要有兩個作用,一修飾作用域;二修飾生存期
1.static修飾全局變量:修飾作用域
static修飾的靜態全局變量與普通全局變量唯一的區別是:靜態全局變量僅在此源文件中有效,不能被其他源文件引用。該全局變量的作用域被限定在此源文件。
2.static修飾函數:修飾作用域。
static修飾的函數,作用域僅在此源文件,不能在其他源文件中調用。該函數的作用域被限定在此源文件。
static1.c
//******* //file1.c文件代碼如下 //******* static int n = 10; //靜態全局變量 static void foo() //靜態函數 { printf("Hello world !"); } .... //******* //file2.c //******* extern int n; //extern聲明使用file1中的n,引發錯誤,因為n為static靜態全局變量 //如果n未用static修飾,通過extern可引用file1.c中的n extern void foo(); //同上,引發錯誤,靜態函數作用僅在其源文件內 ....
3.static修飾局部變量:修飾生存期
static修飾的靜態局部變量,同普通局部變量的區別:
•靜態局部變量存儲在靜態區,普通局部變量存儲在棧區。
•靜態局部變量未初始化時,系統自動置0;初始化僅在函數初次調用時進行一次。
•靜態局部變量在函數結束時不會釋放,其生存期為整個程序運行期,並能保存上次調用的值。
static2.c
#include<stdio.h> void foo() { static int counter=0; //僅在初次調用foo()時初始化 printf("counter:%d",counter); counter++; } int main() { foo(); //第一次調用foo(),counter輸出0 foo(); //第二次調用foo(),counter輸出1 return 0; }去掉static再運行一下程序,結果不同。