static 關鍵字有三種用法
- static 修飾區域變數 - 靜態區域變數
- static 修飾全域變數 - 靜態全域變數
- static 修飾函式 - 靜態函式
static 關鍵字的三種用法
- 1. static 修飾區域變數 - 靜態區域變數
- 2. static 修飾全域變數 - 靜態全域變數
- 3. static 修飾函式 - 靜態函式
1. static 修飾區域變數 - 靜態區域變數
static可使得區域變數出了自己的范圍也不會銷毀,本質上是改變了區域變數的生命周期,但其作用域還是區域的,
詳細點說,就是有時我們希望函式中區域變數的值在函式呼叫結束后不銷毀而繼續保留原值,即希望其占用的存盤單元不釋放,在下一次再呼叫該函式時,該變數已有值(就是上一次函式呼叫結束時的值),
這時就該指定該區域變數為“靜態區域變數”,用關鍵字static 對其進行宣告,
我們一起通過下面簡單的例子來了解它的特點,
#include<stdio.h>
int fun(int a)
{
int b = 0;
static int c = 3;
b = b + 1;
c = c + 1;
return (a + b + c);
}
int main()
{
int a = 2, i;
for (i = 0; i < 3; i++)
printf("%d\n", fun(a));
return 0;
}
運行結果
7
8
9
前后三次呼叫fun函式,b、c的值變化如下表

決議:靜態區域變數?是在編譯時賦初值的,即只賦初值一次,在程式運行時它已有初值,以后每次呼叫函式時不再重新賦初值而只是保留上次函式呼叫結束時的值,而對自動變數(b)賦初值,不是在編譯時進行的,而是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當于執行一次賦值陳述句,
另外,我們還要知道,
如果在定義區域變數時不給它賦初值,那么對靜態區域變數來說,編譯時自動賦初值0(對數值型變數),或者空字符’\0’ (對字符變數),而對自動變數來說,其值是個不確定的值,
雖然靜態區域變數在函式呼叫結束后仍然存在,但其他函式不能參考它,因為它是區域變數,只能被本函式參考,而不能被其他函式參考,
2. static 修飾全域變數 - 靜態全域變數
全域變數本身是具有外部鏈接屬性的,即全域變數的作用域是整個工程,但是如果用 static 修飾全域變數,就會使得全域變數失去外部鏈接屬性,變成內部鏈接屬性,即只能在自己的檔案中使用,所以 static 修飾的全域變數時,只能在自己的 .c 檔案中使用,
我們一起來看下面這個例子:
我們創建兩個檔案,add.c和test.c,此時專案可以運行,

輸出
2000
但當我們一旦用static來修飾全域變數g_val時,就會報錯,如下:

3. static 修飾函式 - 靜態函式
函式默認是有外部鏈接屬性的,但是被 static 修飾后,會使得函式失去外部鏈接屬性,變成內部鏈接屬性,所以 static 修飾的函式只能在自己所在的 .c 檔案內部使用,不能在其他檔案中使用,和 static 修飾全域變數 很像,
一起來看下面這個例子

當在函式Add前加一個static時,報錯

以上就是我整理的C語言中static 關鍵字的三種用法,
如有錯誤,大家多多指正,
記得點贊****關注,見證我的成長!
讓我們一起學習,一起進步,加油!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292774.html
標籤:其他
