<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
static關鍵字不僅可以用來修飾變數,還可以用來修飾函數。在使用static關鍵字修飾變數時,我們稱此變數為靜態變數。靜態變數的儲存方式與全域性變數一樣,都是靜態儲存方式。靜態變數屬於靜態儲存方式,屬於靜態儲存方式的變數卻不一定就是靜態變數。
先看段程式碼:
#include <stdio.h> void test() { int m = 0; m = m + 1; printf("%d", m); } int main() { int n = 0; while (n < 10) { test(); n++; } }
輸出結果:
這個結果沒問題,下面咱們加個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; }
輸出結果:
static 修飾區域性變數的時候,其實改變的是區域性變數的儲存位置,靜態的區域性變數是放在靜態區,放在靜態區的變數出了作用域是不會銷燬的,相當於生命週期延長了。
注:變數的作用域是不變的,只是生命週期延長了。
建立一個原始檔:a.c
int g_val=2022;//全域性變數
參照全域性變數:全域性變數的作用域是整個工程
#include <stdio.h> extern g_val;//extern 用來宣告外部命令 int main() { printf("%dn", g_val); return 0; }
輸出結果:
static可以修飾全域性變數,加上static看一下有什麼不同:
static int g_val = 2022;//全域性變數
主檔案不變:
#include <stdio.h> extern g_val;//extern 用來宣告外部命令 int main() { printf("%dn", g_val); return 0; }
輸出結果:
此時會報錯:一個全域性變數具有外部連結屬性的 (就是可以被其他原始檔參照)但是被static 修飾後外部連結屬性就變成了內部連結屬性 只能在自己所在的原始檔內部使用不能在其他檔案內部使用.
所以再次偵錯的時候就會報錯
原始檔a.c中建立個函數名為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("%dn", c); return 0; }
輸出結果:
其實一個函數本身具有外部連結屬性 被static修飾後外部連結屬性變成了內部連結屬性 ,只能在原始檔a.c 內部使用了,其他原始檔無法使用,使用上感覺作用域變小,我們可以發現 static 修飾全域性變數和修飾函數用法一樣 。
總結 在修飾變數的時, static修飾的靜態區域性變數只執行一次,而且延長了區域性變數的生命週期,直到程式執行結束以後才釋放。static修飾全域性變數的時,這個全域性變數只能在本檔案中存取,不能在其它檔案中存取,即便是extern外部宣告也不可以。static修飾一個函數,則這個函數的只能在本檔案中呼叫,不能被其他檔案呼叫。Static修飾的區域性變數存放在全域性資料區的靜態變數區。
1、隱藏變數或函數、隔離錯誤,有利於模組化程式
在程式設計中,難免會用到全域性變數,全域性變數的作用域是整個源程式,當一個源程式由多個原始檔組成時,全域性變數在所有的原始檔中都是有效的。如果希望全域性變數僅限於在本原始檔中使用,在其他原始檔中不能參照,也就是說限制其作用域只在定義該變數的原始檔內有效,而在同一源程式的其他原始檔中不能使用,這時,就可以通過在全域性變數上加static來實現,使全域性變數被定義成一個靜態全域性變數。這樣就可以避免其他原始檔使用該變數、避免其他原始檔因為該變數引起的錯誤。起到了對其他原始檔隱藏該變數和隔離錯誤的作用,有利於模組化程式。
2、保持變數內容的永續性
有時候,我們希望函數中區域性變數的值在函數呼叫結束之後不會消失,仍然保留函數呼叫結束的值。即它所在的儲存單元不釋放。這時,應該將該區域性變數用關關鍵字static宣告為靜態區域性變數。當區域性變數被宣告為靜態區域性變數的時候,也就改變了區域性變數的儲存位置,從原來的棧中存放改為靜態儲存區存放,全域性變數也存放在靜態儲存區,靜態區域性變數與全域性變數的主要區別就在於可見性,靜態區域性變數只在其被宣告的程式碼塊中是可見的。
到此這篇關於C語言中static使用的文章就介紹到這了,更多相關C語言static用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45