日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对C语言 static作用——修饰 变量(全局变量/局部变量)、函数

發布時間:2025/10/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对C语言 static作用——修饰 变量(全局变量/局部变量)、函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
*******************************概念********************************************
*******************************************************************************
首先得明白全局變量、靜態全局變量、局部變量、靜態局部變量的概念,下面進行舉例:
//main.c文件中 int a = 0; //全局變量 static int b=0;//靜態全局變量 main() { int c; //局部變量 static int d;//靜態局部變量 }
  • 全局變量:具有全局作用域,全局變量只需在一個源文件中定義,就可以作用于所有的源文件。
  • 靜態全局變量:具有全局作用域,它與全局變量的區別在于如果程序包含多個文件的話,它作用于定義它的文件里,不能作用到其它文件里,即被 static 關鍵字修飾過的變量具有文件作用域。
  • 局部變量:具有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束后,變量被撤銷,其所占用的內存也被收回。
  • 靜態局部變量:具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束都一直存在。
**************************C語言中的static的用法********************************
*******************************************************************************
static變量 ( 修飾全局變量 與 局部變量) 的例子:??
#include<stdio.h> static int j; //修飾靜態的全局變量 int funOne(void) {static int i = 0;//修飾靜態的局部變量i++;return i; }int funTwo(void) {j = 0;j=j+2;return j; }int main() {int k = 0,m = 0,n = 0;for(k = 0;k < 5;k++){m = funOne();n = funTwo();printf("m=%d,n=%d\n",m,n);}return 0; } ****************結果顯示如下**************** m=1,n=2 m=2,n=2 m=3,n=2 m=4,n=2 m=5,n=2
************對結果的解釋說明************ 對于funOne( ),運行一次之后,變量i保持了原來的數據,并沒有銷毀,而是在下一次調用的時候繼>續使用,所以才會有1、2、3…5這樣的結果。而對于funTwo( ),運行一次之后,變量j的值被銷毀了,所>以第二次調用結束j仍然保持原值“1”,所以循環五次,每次都是11、static修飾全局變量——靜態全局變量

? ? 使用方法:在全局變量前面加static關鍵字,例如:static int i = 0;

? ? 初始化:未經初始化的全局變量會被自動初始化為0(自動對象的值是任意的,除非他被顯示初始化);

? ? 存儲的位置:靜態存儲區 (static) ,全局變量和靜態變量是存儲在一起的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域,程序結束后由系統自動釋放。

? ? 變量的作用域:具有全局作用域,只初始化一次,它與全局變量的區別在于如果程序包含多個文件的話,它作用于定義它的文件里,不能作用到其它文件里,即被 static 關鍵字修飾過的變量具有文件作用域。(使得作用域僅限于被定義的文件中 即,從變量定義到本文件結尾處,其他文件不論通過什么方式都不能訪問)。

? ? 總結:靜態局部變量值初始化一次;若不賦初值,在初始化的時候會自動賦值為0;只作用于定義他的文件中,不能作用于其他的文件中;把全局變量改變為靜態變量是改變了他作用域。

2、static修飾局部變量——靜態局部變量? ??

? ??使用方法:在局部變量前面加static關鍵字,例如:static int j;?

? ? 初始化:未經初始化的局部變量會被自動初始化為0(自動對象的值是任意的,除非他被顯示初始化);

? ? 存儲的位置:靜態存儲區 (static) ,全局變量和靜態變量是存儲在一起的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域,程序結束后由系統自動釋放。

? ? 引入靜態局部變量的原因:

????????????通常再函數體內定義了一個變量,每當程序運行到改函數時候就會給局部變量分配棧內存,但隨著程序退出函數體,系統就會收回棧內存,局部變量也響應的失效。但是有的時候我們需要在兩次調用之間對變量的值進項保存。通常的想法是定義一個全局變量來實現。但是這樣一來,變量就已經不再屬于函數本身了,不再僅受函數的控制,給程序的維護帶來不便利。靜態局部變量正好解決了這個問題,靜態局部變量保存在全局數據區(靜態存儲區),而不是保存在棧中,每次的值保持到下一次調用,直到下一次賦新值。

? ? ?變量的作用域:具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束都一直存在。(當定義他的函數或者語句塊結束的時候,作用域結束,但是當局部靜態變量離開作用域后,并沒有被銷毀,而是仍然駐留在內存當中,只不過我們不能再對他進行訪問,直到改函數再次被調用嗎,并且值不變)

? ? 總結:靜態局部變量值初始化一次;若不賦初值,在初始化的時候會自動賦值為0;只對定義自己的函數體始終可見;把局部變量改變為靜態變量是改變了他的存儲方式即改變了他的生存周期。

? ? 靜態局部變量與動態局部變量的區別:?

(1)靜態局部變量數據屬于靜態存儲類別,在靜態存儲區內分配內存單元,在整個程序運行期間都不釋放。而自動變量(即動態局部變量)屬于動態存儲類別,占動態存儲區空間而不占

用靜態存儲區空間,函數調用結束后立即釋放空間。

(2)靜態局部變量時在編譯時被賦值的,即自始至終只賦值一次,在程序運行時它已經有初值。以后每次調用函數時不再重新賦初值而只是保留上次函數調用結束時的值。而自動變量賦初值,不是在編譯時進行的,而是在運行時進行,所以每調用一次函數就賦一次初值。

(3)如在定義局部變量時不賦初值,則對靜態局部變量來說,編譯時自動賦一個初值0(對數值型變量)或空字符(對字符變量)。而對自動變量來說,如果不賦初值,則它的值是一個不確定的值。這是由每次動態分配的內存單元不同所決定的。

static變量 ( 修飾全局變量 與 局部變量) 的例子:??

/*在text.c文件中*/ int func_int() {return 2; }static int func_static() {return 3; } /*在main.c文件中*/ #include<stdio.h> void main() {int temp2 = func_int(); int temp3 = func_static(); printf("temp2 = %d\n",temp2);printf("temp3 = %d\n",temp3); } //編譯鏈接[root@node-2 C_function]# gcc main.c test.c

????? ? 驗證的時候可以先把 后面兩行注釋掉int temp3 = func_static();?printf("temp3 = %d\n",temp3);?

***************結果顯示如下************* [root@node-2 C_function]# gcc main.c test.c /tmp/ccg1gHfy.o: In function `main': main.c:(.text+0x1b): undefined reference to `func_static' collect2: error: ld returned 1 exit status

3、static修飾函數——靜態函數(內部函數)

? ?在函數前加static,則此函數成為靜態函數(內部函數),我們用static修飾函數的主要目的是:用來表示不能被其它文件訪問的一個函數(和用static修飾全局變量的目的一樣,都是不允許其它文件訪問)。這樣一來便有一個好處:程序員不用擔心自己編寫的函數與其他文件的函數同名。(對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件


參考的網址:

1》變量在內存中的存放區別:https://www.cnblogs.com/bakari/archive/2012/08/05/2623637.html

2》C\C++中STATIC的用法:https://www.cnblogs.com/jhmu0613/p/7131997.html

3》四個變量間的區別:https://www.cnblogs.com/zhangwuji/p/5297631.html

4》部分內存的分布情況:https://blog.csdn.net/jsjwql/article/details/1788286


總結

以上是生活随笔為你收集整理的对C语言 static作用——修饰 变量(全局变量/局部变量)、函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。