static--修饰(局部变量、全局变量、函数)
文章轉載鏈接:?https://blog.csdn.net/Payshent/article/details/70242965
在我們剛開始接觸接觸C語言的時候一定聽說過static關鍵字,在剛開始學習C語言的時候相信很多人都會對static感到記憶深刻,剛開始學的時候我也一臉懵逼,現在覺得時候做一個歸納整理了。static的用法也就下面幾點,?
1):static修飾局部變量?
2):static修飾全局變量?
3):static修飾函數
一、static修飾局部變量
普通的局部變量是在棧上進行分配的,局部變量所處的函數被多次調用時每次調用的位置都不一樣的。局部變量也可以在堆上進行動態的分配,但須記得釋放空間。?
靜態局部變量和普通局部變量區別如下:?
訪問權限:靜態局部變量只能被其作用域內的變量和函數進行訪問使用,它雖然存在與程序的整個生命周期,但由于是static的所以不能被其他函數和源文件訪問。?
作用位置:靜態局部變量被編譯器存放在全局存儲區(data),所以它雖然是局部的但是卻存在與整個生命周期。?
值:靜態的局部變量如果沒有被初始化,會自動被編譯器賦值為0,以后每次調用靜態局部變量就都會用上次調用的值(每次函數調用靜態局部變量都修改它然后離開,下次讀的時候從全局存儲區讀的靜態局部變量就是上次修改后的值)。?
注意:?
由于函數的每次調用,普通的局部變量都會重新分配,而靜態局部變量會保持上次調用的值不變。正是由于static局部變量的這種特性,使得靜態局部變量的函數變得不可重入,即每次調用可能會產生不同的結果,這在多線程編程時可能會成為一種隱患。
二、static修飾全局變量
說到靜態局部變量我們先來看看一個進程在內存中的布局:?
.text段(文本段)保存的是進程所執行的二進制文件,.data段(數據段)保存進程已經初始化的全局變量,.bss段保存進程未初始化的全局變量。在進程的整個生命周期中,.data段和.bss段內的數據是根整個進程同生共死的,也就是在進程結束之后這些數據才會壽終正寢。當一個進程的全局變量被聲明為static之后,靜態全局變量和其他全局變量在存儲位置并沒有區別,都是在.data段(已初始化)和.bss段(未初始化區),但它只在定義它的源文件內是有效的,在同一 程序的其他源文件內是不可見的,這就是靜態全局變量和普通全局變量的區別。
對static修飾的局部變量和全局變量還有疑問的話,可參照我的另一篇博客將靜態局部變量,靜態全局變量、局部變量、全局變量做的有詳細的說明:?
局部變量、全局變量、靜態局部變量、靜態全局變量?
(點擊可查看)。
三、static修飾函數
當一個程序中有很多源文件的時候,每個源文件可能會提供一些外界需要的接口,其他的函數可能是為了實現這些接口而編寫的,這些函數可能不希望被外界所看見就用static來修飾這個函數,這就是靜態函數。靜態函數有些類似與C++里面private函數。?
static函數可以很好的解決不同原文件中函數同名的問題,因為一個源文件中的static函數對其他文件來說是不可見的。
tatic函數與普通函數作用域不同,僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static修飾的函數),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件.?
static函數在內存中只有一份,普通函數在每個調用中都有一份拷貝
總結
以上是生活随笔為你收集整理的static--修饰(局部变量、全局变量、函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日志打印的8种级别(很详细)
- 下一篇: php有关卡的消消乐源码,查看“宝可消消