C語言中static的使用方法實例詳解
前言
static關(guān)鍵字不僅可以用來修飾變量,還可以用來修飾函數(shù)。在使用static關(guān)鍵字修飾變量時,我們稱此變量為靜態(tài)變量。靜態(tài)變量的存儲方式與全局變量一樣,都是靜態(tài)存儲方式。靜態(tài)變量屬于靜態(tài)存儲方式,屬于靜態(tài)存儲方式的變量卻不一定就是靜態(tài)變量。
一、static修飾變量
1.修飾局部變量
先看段代碼:
#include <stdio.h> void test() { int m = 0; m = m + 1; printf("%d", m); } int main() { int n = 0; while (n < 10) { test(); n++; } }
輸出結(jié)果:
這個結(jié)果沒問題,下面咱們加個static對比一下:
#include <stdio.h> void test() { static int m = 0; m = m + 1; printf("%d", m); } int main() { int n = 0; while (n < 10) { test(); n++; } return 0; }
輸出結(jié)果:
static 修飾局部變量的時候,其實改變的是局部變量的存儲位置,靜態(tài)的局部變量是放在靜態(tài)區(qū),放在靜態(tài)區(qū)的變量出了作用域是不會銷毀的,相當(dāng)于生命周期延長了。
注:變量的作用域是不變的,只是生命周期延長了。
2.修飾全局變量
創(chuàng)建一個源文件:a.c
int g_val=2022;//全局變量
引用全局變量:全局變量的作用域是整個工程
#include <stdio.h> extern g_val;//extern 用來聲明外部命令 int main() { printf("%d\n", g_val); return 0; }
輸出結(jié)果:
static可以修飾全局變量,加上static看一下有什么不同:
static int g_val = 2022;//全局變量
主文件不變:
#include <stdio.h> extern g_val;//extern 用來聲明外部命令 int main() { printf("%d\n", g_val); return 0; }
輸出結(jié)果:
此時會報錯:一個全局變量具有外部鏈接屬性的 (就是可以被其他源文件引用)但是被static 修飾后外部鏈接屬性就變成了內(nèi)部鏈接屬性 只能在自己所在的源文件內(nèi)部使用不能在其他文件內(nèi)部使用.
所以再次調(diào)試的時候就會報錯
二、static修飾函數(shù)
源文件a.c中創(chuàng)建個函數(shù)名為add:
代碼如下:
static int add(int x, int y) { int z = x + y; return z; }
主文件test.c如下:
extern add(int x, int y); int main() { int a = 2; int b = 3; int c = add(a, b); printf("%d\n", c); return 0; }
輸出結(jié)果:
其實一個函數(shù)本身具有外部鏈接屬性 被static修飾后外部鏈接屬性變成了內(nèi)部鏈接屬性 ,只能在源文件a.c 內(nèi)部使用了,其他源文件無法使用,使用上感覺作用域變小,我們可以發(fā)現(xiàn) static 修飾全局變量和修飾函數(shù)用法一樣 。
總結(jié) 在修飾變量的時, static修飾的靜態(tài)局部變量只執(zhí)行一次,而且延長了局部變量的生命周期,直到程序運行結(jié)束以后才釋放。static修飾全局變量的時,這個全局變量只能在本文件中訪問,不能在其它文件中訪問,即便是extern外部聲明也不可以。static修飾一個函數(shù),則這個函數(shù)的只能在本文件中調(diào)用,不能被其他文件調(diào)用。Static修飾的局部變量存放在全局數(shù)據(jù)區(qū)的靜態(tài)變量區(qū)。
補充:static的好處是什么?
1、隱藏變量或函數(shù)、隔離錯誤,有利于模塊化程序
在編程中,難免會用到全局變量,全局變量的作用域是整個源程序,當(dāng)一個源程序由多個源文件組成時,全局變量在所有的源文件中都是有效的。如果希望全局變量僅限于在本源文件中使用,在其他源文件中不能引用,也就是說限制其作用域只在定義該變量的源文件內(nèi)有效,而在同一源程序的其他源文件中不能使用,這時,就可以通過在全局變量上加static來實現(xiàn),使全局變量被定義成一個靜態(tài)全局變量。這樣就可以避免其他源文件使用該變量、避免其他源文件因為該變量引起的錯誤。起到了對其他源文件隱藏該變量和隔離錯誤的作用,有利于模塊化程序。
2、保持變量內(nèi)容的持久性
有時候,我們希望函數(shù)中局部變量的值在函數(shù)調(diào)用結(jié)束之后不會消失,仍然保留函數(shù)調(diào)用結(jié)束的值。即它所在的存儲單元不釋放。這時,應(yīng)該將該局部變量用關(guān)關(guān)鍵字static聲明為靜態(tài)局部變量。當(dāng)局部變量被聲明為靜態(tài)局部變量的時候,也就改變了局部變量的存儲位置,從原來的棧中存放改為靜態(tài)存儲區(qū)存放,全局變量也存放在靜態(tài)存儲區(qū),靜態(tài)局部變量與全局變量的主要區(qū)別就在于可見性,靜態(tài)局部變量只在其被聲明的代碼塊中是可見的。
總結(jié)
到此這篇關(guān)于C語言中static使用的文章就介紹到這了,更多相關(guān)C語言static用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)坦克大戰(zhàn)小游戲EGE圖形界面
這篇文章主要為大家詳細介紹了C++實現(xiàn)坦克大戰(zhàn)小游戲EGE圖形界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03C++ 數(shù)據(jù)結(jié)構(gòu)完全二叉樹的判斷
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)完全二叉樹的判斷的相關(guān)資料,需要的朋友可以參考下2017-06-06