static和const的用途,const與define的區(qū)別

一.Static的作用詳述

摘要:C語言中慷荔,static的字面意思很容易把我們導(dǎo)入歧途雕什。本文將對C/C++中Static進(jìn)行詳述。

1.先來介紹它的第一條也是最重要的一條:隱藏显晶。

當(dāng)我們同時編譯多個文件時贷岸,所有未加static前綴的全局變量和函數(shù)都具有全局可見性。為理解這句話磷雇,我舉例來說明偿警。我們要同時編譯兩個源文件,一個是a.c唯笙,另一個是main.c.

下面是a.c的內(nèi)容:

char a = 'A'; // global variable
void msg()
{
    printf("Hello\n");
}

下面是main.c的內(nèi)容:

int main(void)
{
  extern char a; // extern variable must be declared before use
  printf("%c ", a);
  (void)msg();
  return 0;
}

程序的運行結(jié)果是:

A Hello

你可能會問:為什么在a.c中定義的全局變量a和函數(shù)msg能在main.c中使用螟蒸?前面說過盒使,所有未加static前綴的全局變量和函數(shù)都具有全局可見性,其它的源文件也能訪問七嫌。此例中少办,a是全局變量,msg是函數(shù)诵原,并且都沒有加static前綴英妓,因此對于另外的源文件main.c是可見的。

如果加了static绍赛,就會對其它源文件隱藏鞋拟。例如在a和msg的定義前加上static,main.c就看不到它們了惹资。利用這一特性可以在不同的文件中定義同名函數(shù)和同名變量贺纲,而不必?fù)?dān)心命名沖突。Static可以用作函數(shù)和變量的前綴褪测,對于函數(shù)來講猴誊,static的作用僅限于隱藏,而對于變量侮措,static還有下面兩個作用懈叹。

2.static的第二個作用是保持變量內(nèi)容的持久。

存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運行時就完成初始化分扎,也是唯一的一次初始化澄成。共有兩種變量存儲在靜態(tài)存儲區(qū):全局變量和static變量,只不過和全局變量比起來畏吓,static可以控制變量的可見范圍墨状,說到底static還是用來隱藏的。雖然這種用法不常見菲饼,但我還是舉一個例子肾砂。

#include<stdio.h>
int fun(void){
  static int count = 10; //事實上此賦值語句從來沒有執(zhí)行過
  return count--;
}

int count = 1;

int main(void)
{
  printf("global\t\tlocal static\n");
  for(; count<= 10; ++count)
   printf("%d\t\t%d\n", count, fun());
  return 0;
}

程序的運行結(jié)果是:

global local static

110

29

38

47

56

65

74

83

92

101

3.static的第三個作用是默認(rèn)初始化為0.其實全局變量也具備這一屬性,因為全局變量也存儲在靜態(tài)數(shù)據(jù)區(qū)宏悦。

在靜態(tài)數(shù)據(jù)區(qū)镐确,內(nèi)存中所有的字節(jié)默認(rèn)值都是0x00,某些時候這一特點可以減少程序員的工作量饼煞。比如初始化一個稀疏矩陣源葫,我們可以一個一個地把所有元素都置0,然后把不是0的幾個元素賦值砖瞧。如果定義成靜態(tài)的息堂,就省去了一開始置0的操作。再比如要把一個字符數(shù)組當(dāng)字符串來用,但又覺得每次在字符數(shù)組末尾加‘\0’太麻煩。如果把字符串定義成靜態(tài)的遵湖,就省去了這個麻煩册着,因為那里本來就是‘\0’。不妨做個小實驗驗證一下晒来。

#include<stdio.h>
int a;
int main(void)
{
  int i;
  static char str[10];
  printf("integer: %d; string: (begin)%s(end)", a, str);
  return 0;
}

程序的運行結(jié)果如下integer:0;string:(begin)(end)

最后對static的三條作用做一句話總結(jié)。首先static的最主要功能是隱藏屡拨,其次因為static變量存放在靜態(tài)存儲區(qū),所以它具備持久性和默認(rèn)值0.

二.const和static const的區(qū)別

對于C/C++語言來講,

const就是只讀的意思,只在聲明中使用;

static一般有2個作用,規(guī)定作用域和存儲方式.對于局部變量,static規(guī)定其為靜態(tài)存儲方式,每次調(diào)用的初始值為上一次調(diào)用的值,調(diào)用結(jié)束后存儲空間不釋放;

對于全局變量,如果以文件劃分作用域的話,此變量只在當(dāng)前文件可見;對于static函數(shù)也是在當(dāng)前模塊內(nèi)函數(shù)可見.

static const應(yīng)該就是上面兩者的合集.

下面分別說明:

全局:

const,只讀的全局變量,其值不可修改.

static,規(guī)定此全局變量只在當(dāng)前模塊(文件)中可見.

static const,既是只讀的,又是只在當(dāng)前模塊中可見的.

文件:

文件指針可當(dāng)作一個變量來看,與上面所說類似.

函數(shù):

const,返回只讀變量的函數(shù).

static,規(guī)定此函數(shù)只在當(dāng)前模塊可見.

類:

const,一般不修飾類,(在VC6.0中試了一下,修飾類沒啥作用)

static,C++中似乎沒有靜態(tài)類這個說法,一般還是拿類當(dāng)特殊的變量來看.C#中有靜態(tài)類的詳細(xì)說明,且用法與普通類大不相同.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褥实,一起剝皮案震驚了整個濱河市呀狼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌损离,老刑警劉巖哥艇,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異僻澎,居然都是意外死亡貌踏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門窟勃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祖乳,“玉大人,你說我怎么就攤上這事秉氧【炖ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵汁咏,是天一觀的道長亚斋。 經(jīng)常有香客問我,道長攘滩,這世上最難降的妖魔是什么伞访? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮轰驳,結(jié)果婚禮上厚掷,老公的妹妹穿的比我還像新娘。我一直安慰自己级解,他們只是感情好冒黑,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勤哗,像睡著了一般抡爹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芒划,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天冬竟,我揣著相機與錄音欧穴,去河邊找鬼。 笑死泵殴,一個胖子當(dāng)著我的面吹牛涮帘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笑诅,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼调缨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吆你?” 一聲冷哼從身側(cè)響起弦叶,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妇多,沒想到半個月后伤哺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡者祖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年立莉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咸包。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡桃序,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烂瘫,到底是詐尸還是另有隱情媒熊,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布坟比,位于F島的核電站芦鳍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏葛账。R本人自食惡果不足惜柠衅,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望籍琳。 院中可真熱鬧菲宴,春花似錦、人聲如沸趋急。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呜达。三九已至谣蠢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眉踱。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工挤忙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谈喳。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓册烈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叁执。 傳聞我的和親對象是個殘疾皇子茄厘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. const 常量變量const 類型說明符 變量名 常引用const 類型說明符 &引用名 常對象類名 co...
    一葉之界閱讀 952評論 0 2
  • const修飾變量的理解 一般說到const,第一反應(yīng)就是聲明一個常量,你可以這么用胎署,但是你應(yīng)該知道這其中的差別吆录,...
    隨風(fēng)流逝閱讀 668評論 0 0
  • C++ 關(guān)鍵字 Const Define Static 作者:AceTan,轉(zhuǎn)載請標(biāo)明出處! 今天來討論一下在C+...
    AceTan閱讀 2,135評論 2 10
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法琼牧,類相關(guān)的語法恢筝,內(nèi)部類的語法,繼承相關(guān)的語法巨坊,異常的語法撬槽,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 不是每個人生來就敢愛敢恨。不然也就沒有那些五味雜陳的暗戀故事趾撵。如果每個人都能大膽說愛侄柔,是不是就不會有那么多遺憾?也...
    懶兒波平斯閱讀 275評論 2 5