不一樣於其餘關鍵字,他們都有多種用法,並且在必定環境下使用,能夠提升程序的運行性能,優化程序的結構。這篇文章主要介紹了C語言中靜態關鍵字static的做用,對你們學習C語言很是有幫助。java
C語言中,static關鍵字修飾變量和函數:編程
一、局部變量函數
二、全局變量性能
三、函數學習
static關鍵字最基本的用法是:優化
一、被static修飾的變量屬於類變量,能夠經過類名.變量名直接引用,而不須要new出一個類來編碼
二、被static修飾的方法屬於類方法,能夠經過類名.方法名直接引用,而不須要new出一個類來spa
被static修飾的變量、被static修飾的方法統一屬於類的靜態資源,是類實例之間共享的,換言之,一處變、到處變。JDK把不一樣的靜態資源放在了不一樣的類中而不把全部靜態資源放在一個類裏面,不少人可能想固然認爲固然要這麼作,可是是否想過爲何要這麼作呢?我的認爲主要有三個好處:視頻
一、不一樣的類有本身的靜態資源,這能夠實現靜態資源分類。好比和數學相關的靜態資源放在java.lang.Math中,和日曆相關的靜態資源放在java.util.Calendar中,這樣就很清晰了blog
二、避免重名。不一樣的類之間有重名的靜態變量名、靜態方法名也是很正常的,若是全部的都放在一塊兒不可避免的一個問題就是名字重複,這時候怎麼辦?分類放置就行了。
三、避免靜態資源類無限膨脹,這很好理解。
下面咱們具體瞭解一下static關鍵字的用法。
一、用靜態關鍵字static修飾的局部變量,在編譯的過程當中,會在數據區爲該變量開闢空間,並對其進行初始化,若是代碼中未對其進行初始化,則系統默認初始化爲0。
二、用static修飾的局部變量,會延長局部變量的壽命,超出函數的生存期。
三、對靜態關鍵字修飾的局部變量的初始化。
如下面兩個變量a和變量爲b進行說明,在編譯過程當中,發現變量a和b是靜態變量,會標識變量a與b,等到程序運行的時候,在主函數調用以前,對變量a和變量b分配空間,並對變量a進行初始化,因爲變量b是由函數fun傳遞的參數進行初始化的,故會在程序調用函數時對變量b進行初始化,對變量b初始化以前,會檢查變量b的標識位,若是標識位爲0,就會拿函數參數x對其進行初始化,標識位爲1就不進行初始化。
static int a = 0;(編譯過程進行初始化)
static int b = x;(運行該代碼的時候進行初始化)
void fun(int x)
{
static int a = 10;
static int b = x;
a++;
b++;
}
全局變量定義在函數體外部,在全局數據區分配存儲空間,且編譯器會自動對其初始化。
普通全局變量對整個工程可見,其餘文件可使用extern外部聲明後直接使用。也就是說其餘文件不能再定義一個與其相同名字的變量了(不然編譯器會認爲它們是同一個變量)。
靜態全局變量僅對當前文件可見,其餘文件不可訪問,其餘文件能夠定義與其同名的變量,二者互不影響。
在定義不須要與其餘文件共享的全局變量時,加上static關鍵字可以有效地下降程序模塊之間的耦合,避免不一樣文件同名變量的衝突,且不會誤使用。
函數的使用方式與全局變量相似,在函數的返回類型前加上static,就是靜態函數。其特性以下:
靜態函數只能在聲明它的文件中可見,其餘文件不能引用該函數
不一樣的文件可使用相同名字的靜態函數,互不影響
非靜態函數能夠在另外一個文件中直接引用,甚至沒必要使用extern聲明
下面兩個文件的例子說明使用static聲明的函數不能被另外一個文件引用:
/* file1.c */
#include <stdio.h>
static void fun(void)
{
printf("hello from fun.\n");
}
int main(void)
{
fun();
fun1();
return 0;
}
/* file2.c */
#include <stdio.h>
static void fun1(void)
{
printf("hello from static fun1.\n");
}
使用 gcc file1.c file2.c編譯時,錯誤報告以下:
/tmp/cc2VMzGR.o:在函數‘main’中:
static_fun.c:(.text+0x20):對‘fun1’未定義的引用
collect2: error: ld returned 1 exit status
修改文件,不使用static修飾符,可在另外一文件中引用該函數:
/* file1.c */
#include <stdio.h>
void fun(void)
{
printf("hello from fun.\n");
}
/* file2.c */
int main(void)
{
fun();
return 0;
}
一樣使用 gcc file1.c file2.c編譯,編譯經過,運行結果以下:
-> % ./a.out
hello from fun.
static是一個頗有用的關鍵字,使用得當可使程序錦上添花。固然,有的公司編碼規範明確規定只用於本文件的函數要所有使用static關鍵字聲明,這是一個良好的編碼風格。
不管如何,要在實際編碼時注意本身的編碼習慣,儘可能體現出語言自己的優雅和編碼者的編碼素質。
以上就是關鍵字static的所有用法,但願對你們靈活運用關鍵字static有所幫助。
若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!
【C語言C++學習企鵝圈子】,分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!
編程學習書籍:
編程學習視頻: