C语言关于static的解析
C語言關于static的解析
#include<stdio.h>
static int j;
void fun1(void)
{
??int i = 0;
i ++;
}
void fun2(void)
{
j = 0;
j++;
}
int main()
{
for(int k=0; k<10; k++)
?{
fun1();
fun2();
?}
getchar();
return 0;
}
結果:i=10;j=1;
?
在C語言中,static關鍵字有三種用途:
1 用于全局變量定義時。
全局變量定義時加上static修飾,表示該變量為靜態全局變量。作用域為當前文件。
2 用于函數定義或聲明。
任意函數的定義或聲明中包含了static修飾,表示該函數為靜態函數,只能在本文件中被調用。
3 用于局部變量定義。
局部變量定義時,帶有static關鍵字,表示其為靜態局部變量,只被初始化一次,之后每次調用函數時,該變量值為上次函數退出時的值。即,改變量的生存周期被擴展到整個程序運行時間段內。
?
?
定義并初始化和定義之后再賦值,有區別的:
static int i = 0;//定義變量并初始化,只執行一次賦值
static int j;
j=0; //賦值語句,每次都執行
?
static int i = 0;這個只是定義和初始化,由于是static的,所以第一次執行到這里時,回去定義和初始化,但是之后再到這里時,發現已經定義過了,所以不會再定義,這樣也就不會初始化。這個是static的運行機制。
?
?
Static在c語言里面有兩個作用,第一個是修飾變量,第二個是修飾函數。
1、Static修飾變量
按照作用范圍的不同,變量分為局部變量和全局變量。如果用static修飾變量,不論這個變量是全局的還是局部的都是存儲在靜態數據區。下面分開來講:
¨ ?????????如果用static修飾全局變量,我們稱其為靜態全局變量。
我們用static修飾全局變量的主要目的就是:使得其作用域僅限于變量被定義的文件中(即從變量定義處到本文件結尾處),其它文件不論通過什么方式都不能訪問。
¨ ?????????如果用static修飾局部變量,我們稱其為靜態局部變量。
我們用static修飾局部變量的目的主要有兩個:
1) ????????在某個函數體里面定義的靜態局部變量,只能在本函數體被訪問,即使同一個文件的其它函數也訪問不了。
2) ????????靜態局部變量總存儲在靜態數據區,所以即使這個函數運行結束,這個靜態局部變量的值不會被銷毀,函數下次使用時仍然要用到這個值。
?
下面給出一個例程:
?
?
#include <stdio.h>
?
static int j; ?// 靜態全局變量
int fun1(void)
{
?????????static int i = 0;
?????????i++;
?????????return i;
}
?
int fun2(void)
{
?????????j = 0;
?????????j++;
?????????return j;
}
?
int main(int argc, char *argv[])
{
?????????int k = 0, m = 0, n = 0;
?????????for(k=0; k<10; k++){
???????????????????m = fun1( );
???????????????????n = fun2( );
???????????????????printf("%d,%d\n", m, n);
?????????}
?????????return 0;
}
?
結果:
1,1
2,1
3,1
4,1
5,1
6,1
7,1
8,1
9,1
10,1
?
從例程的運行結果可以看出:
對于fun1( ),運行一次之后,變量i保持了原來的數據,并沒有銷毀,而是在下一次調用的時候繼續使用,所以才會有1、2、3…10這樣的結果。而對于fun2( ),運行一次之后,變量j的值被銷毀了,所以第二次調用結束j仍然保持原值“1”,所以循環十次,每次都是1
?
?
2、Static修飾函數
在函數前加static,則此函數成為靜態函數(內部函數),我們用static修飾函數的主要目的是:用來表示不能被其它文件訪問的一個函數(和用static修飾全局變量的目的一樣,都是不允許其它文件訪問)。這樣一來便有一個好處:程序員不用擔心自己編寫的函數與其他文件的函數同名。
?
總結
以上是生活随笔為你收集整理的C语言关于static的解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件上传检测的基本思路
- 下一篇: C 语言包含的数据类型如下图所示: