青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

唐吉訶德

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

常用鏈接

留言簿(2)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

用static聲明的函數和變量小結

 static 聲明的變量在C語言中有兩方面的特征:
  1)、變量會被放在程序的全局存儲區中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變量和堆變量的區別。
  2)、變量用static告知編譯器,自己僅僅在變量的作用范圍內可見。這一點是它與全局變量的區別。
Tips:
  A.若全局變量僅在單個C文件中訪問,則可以將這個變量修改為靜態全局變量,以降低模塊間的耦合度;
  B.若全局變量僅由單個函數訪問,則可以將這個變量改為該函數的靜態局部變量,以降低模塊間的耦合度;
  C.設計和使用訪問動態全局變量、靜態全局變量、靜態局部變量的函數時,需要考慮重入問題;
        D.如果我們需要一個可重入的函數,那么,我們一定要避免函數中使用static變量(這樣的函數被稱為:帶“內部存儲器”功能的的函數)
        E.函數中必須要使用static變量情況:比如當某函數的返回值為指針類型時,則必須是static的局部變量的地址作為返回值,若為auto類型,則返回為錯指針。

函數前加static使得函數成為靜態函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅局限于本文件(所以又稱內部函數)。使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。

擴展分析:術語static有著不尋常的歷史.起初,在C中引入關鍵字static是為了表示退出一個塊后仍然存在的局部變量。隨后,static在C中有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數。為了避免引入新的關鍵字,所以仍使用static關鍵字來表示這第二種含義。最后,C++重用了這個關鍵字,并賦予它與前面不同的第三種含義:表示屬于一個類而不是屬于此類的任何特定對象的變量和函數(與Java中此關鍵字的含義相同)。

全局變量、靜態全局變量、靜態局部變量和局部變量的區別

變量可以分為:全局變量、靜態全局變量、靜態局部變量和局部變量。
          按存儲區域分,全局變量、靜態全局變量和靜態局部變量都存放在內存的靜態存儲區域,局部變量存放在內存的棧區。
          按作用域分,全局變量在整個工程文件內都有效;靜態全局變量只在定義它的文件內有效;靜態局部變量只在定義它的函數內有效,只是程序僅分配一次內存,函數返回后,該變量不會消失;局部變量在定義它的函數內有效,但是函數返回后失效。

全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。

  從以上分析可以看出, 把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域, 限制了它的使用范圍。

  static函數與普通函數作用域不同。僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件

  static全局變量與普通的全局變量有什么區別:static全局變量只初始化一次,防止在其他文件單元中被引用;
  static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值;
       static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
       全局變量和靜態變量如果沒有手工初始化,則由編譯器初始化為0。局部變量的值不可知。

 

 

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

當我們同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個源文件,一個是a.c,另一個是main.c.

下面是a.c的內容:

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

下面是main.c的內容:

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

程序的運行結果是:

A Hello

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

如果加了static,就會對其它源文件隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性可以在不同的文件中定義同名函數和同名變量,而不必擔心命名沖突。Static可以用作函數和變量的前綴,對于函數來講,static的作用僅限于隱藏,而對于變量,static還有下面兩個作用。

2.static的第二個作用是保持變量內容的持久。

存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不過和全局變量比起來,static可以控制變量的可見范圍,說到底static還是用來隱藏的。雖然這種用法不常見,但我還是舉一個例子。

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

程序的運行結果是:

global local static
1  10
2   9
3   8
4   7
5   6
6   5
7   4
8   3
9   2
10  1

3.static的第三個作用是默認初始化為0.其實全局變量也具備這一屬性,因為全局變量也存儲在靜態數據區。

在靜態數據區,內存中所有的字節默認值都是0x00,某些時候這一特點可以減少程序員的工作量。比如初始化一個稀疏矩陣,我們可以一個一個地把所有元素都置0,然后把不是0的幾個元素賦值。如果定義成靜態的,就省去了一開始置0的操作。再比如要把一個字符數組當字符串來用,但又覺得每次在字符數組末尾加‘\0’太麻煩。如果把字符串定義成靜態的,就省去了這個麻煩,因為那里本來就是‘\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;
            }
            

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

最后對static的三條作用做一句話總結。首先static的最主要功能是隱藏,其次因為static變量存放在靜態存儲區,所以它具備持久性和默認值0.

posted on 2010-08-26 09:07 心羽 閱讀(267) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产精品成人综合色在线婷婷| 日韩视频一区二区三区在线播放| 99视频在线精品国自产拍免费观看| 欧美日韩另类国产亚洲欧美一级| 亚洲影院色无极综合| 日韩亚洲欧美一区| 日韩午夜在线电影| 欧美高清一区| 国产精品国产三级国产 | 日韩一级成人av| 国产精品一区三区| 亚洲电影免费观看高清完整版| 欧美日韩网站| 欧美凹凸一区二区三区视频| 欧美日韩精品一二三区| 久久亚洲精品一区二区| 欧美视频日韩| 欧美激情视频一区二区三区免费| 国产精品久久久久久久久久久久久久| 卡通动漫国产精品| 国产精品免费在线| 亚洲欧洲精品成人久久奇米网| 国内精品国产成人| 亚洲性感美女99在线| 亚洲精品久久久久久久久久久| 亚洲欧美日韩另类| 亚洲小说欧美另类社区| 欧美激情第六页| 欧美成人免费大片| 激情欧美一区二区三区| 亚洲直播在线一区| 在线视频欧美日韩精品| 鲁鲁狠狠狠7777一区二区| 久久久99国产精品免费| 国产精品网站在线| 夜夜嗨av一区二区三区| 99国产麻豆精品| 欧美大片网址| 亚洲第一毛片| 亚洲精品社区| 美女国内精品自产拍在线播放| 久久国产免费| 国产日产欧产精品推荐色| 亚洲午夜一区| 亚洲欧美国内爽妇网| 欧美日韩在线免费观看| 亚洲激情在线观看| 亚洲麻豆国产自偷在线| 欧美二区不卡| 亚洲国产视频直播| 亚洲理论在线| 欧美激情在线有限公司| 亚洲欧洲美洲综合色网| 亚洲伦理自拍| 欧美日韩在线视频观看| 中日韩男男gay无套| 亚洲综合电影一区二区三区| 国产精品v欧美精品v日本精品动漫| 亚洲乱码国产乱码精品精可以看| 夜夜嗨一区二区三区| 欧美日韩一区综合| 亚洲一二三区精品| 欧美在线亚洲一区| 一区二区在线免费观看| 老牛嫩草一区二区三区日本| 亚洲大胆人体视频| 99视频一区二区| 欧美色图天堂网| 午夜精品99久久免费| 欧美fxxxxxx另类| 亚洲久久成人| 99精品99久久久久久宅男| 亚洲天堂激情| 国产精品亚洲人在线观看| 欧美一区二区成人6969| 麻豆精品精华液| 亚洲精品国产品国语在线app| 欧美精品一区二| 亚洲欧美日韩久久精品| 欧美寡妇偷汉性猛交| 亚洲精品视频在线观看网站| 欧美日韩另类综合| 欧美一区午夜精品| 亚洲国产免费| 性欧美在线看片a免费观看| 黄色在线一区| 欧美午夜无遮挡| 久久精品成人一区二区三区 | 国产精品一级久久久| 久久久久国产精品麻豆ai换脸| 亚洲高清免费| 欧美在线免费播放| 日韩午夜av| 国产亚洲电影| 欧美日韩福利视频| 久久精品视频导航| 一本色道久久综合狠狠躁篇的优点| 久久精品盗摄| 亚洲一本大道在线| 在线观看日韩精品| 国产精品视频免费| 欧美激情成人在线视频| 久久激情五月激情| 亚洲视频在线观看| 91久久久久久国产精品| 久久噜噜亚洲综合| 午夜亚洲一区| 日韩一区二区精品| 激情一区二区| 国产精品你懂的| 欧美日韩国产综合网| 久久综合中文字幕| 欧美在线三区| 亚洲一区视频在线| 亚洲精品国产精品久久清纯直播 | 国产精品美女视频网站| 欧美激情麻豆| 老司机aⅴ在线精品导航| 欧美一区二区在线观看| 99国产精品国产精品久久| 亚洲第一网站| 欧美bbbxxxxx| 欧美18av| 欧美va亚洲va香蕉在线| 久久一区亚洲| 久久亚洲欧美| 久久亚洲欧洲| 乱人伦精品视频在线观看| 久久久另类综合| 久久久蜜桃一区二区人| 久久国产精品黑丝| 欧美在线啊v| 欧美影院成年免费版| 午夜一区不卡| 久久精品系列| 免费欧美高清视频| 久久中文字幕导航| 欧美精品一区二区三区高清aⅴ| 欧美在线精品免播放器视频| 亚洲欧美日韩中文视频| 午夜激情亚洲| 欧美亚洲在线播放| 久久激情五月激情| 亚洲精品国产精品久久清纯直播| 亚洲成人自拍视频| 亚洲韩日在线| 亚洲国产精品尤物yw在线观看| 亚洲国产美女久久久久| 亚洲每日更新| 亚洲婷婷综合色高清在线| 亚洲一区免费视频| 性欧美8khd高清极品| 久久九九国产精品| 另类酷文…触手系列精品集v1小说| 老**午夜毛片一区二区三区| 欧美国产免费| 国产精品国产三级国产aⅴ浪潮 | 亚洲毛片在线看| 亚洲天堂成人| 久久精品国产亚洲aⅴ| 久久综合九色综合欧美就去吻| 久热精品在线视频| 欧美色图天堂网| 国产一区二区丝袜高跟鞋图片 | 亚洲欧美日韩在线| 久久综合伊人77777蜜臀| 欧美精品久久一区二区| 国产精品普通话对白| 精品动漫3d一区二区三区| 亚洲激情影视| 午夜精品一区二区在线观看| 欧美在线综合视频| 欧美成人黑人xx视频免费观看| 亚洲人午夜精品免费| 亚洲免费视频一区二区| 久久嫩草精品久久久精品一| 欧美成人午夜激情视频| 国产精品你懂得| 亚洲激情黄色| 欧美一区二区三区四区在线| 毛片基地黄久久久久久天堂| 亚洲精选一区二区| 欧美在线视频免费观看| 欧美精品在线观看91| 国产亚洲欧美色| 中文成人激情娱乐网| 久久夜色精品国产噜噜av| 亚洲美女黄色片| 久久久久久久999| 欧美日韩国产精品自在自线| 国模私拍视频一区| 亚洲伊人网站| 欧美激情视频在线播放| 亚洲欧美日韩国产中文| 欧美精品日韩一本| 一区二区视频免费在线观看| 亚洲欧美成人精品| 亚洲欧洲精品成人久久奇米网| 欧美与欧洲交xxxx免费观看| 欧美日韩另类在线|