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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C/C++】关键字static

發布時間:2023/11/30 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C/C++】关键字static 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/woxiaohahaa/article/details/51014224

參考自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html?(華山大師兄)

這里我們只討論了C語言的static


首先我們回顧一下各種變量在內存中的位置:


BSS和DATA段都屬于靜態數據區,在進程運行過程中,靜態數據區的數據始終存在。靜態全局變量和其他全局變量的存儲地點沒有區別,因此還是在BSS和DATA中。但是,靜態全局變量僅在定義它的源文件中有效,其他文件即使用extern聲明也沒法使用他。準確地說作用域是從定義之處開始,到文件結尾處結束,在定義之處前面的那些代碼行也不能使用它。


1、靜態的全局變量和函數

當同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。

舉個例子:

[cpp]?view plaincopy
  • //a.c??
  • #include?<stdio.h>??
  • ??
  • char?a?=?'A';???????????????//?global?variable??
  • void?msg()??
  • {??
  • ?????printf("Hello\n");??
  • }??
  • [cpp]?view plaincopy
  • //a.h??
  • #ifndef?_A_H_??
  • #define?_A_H_??
  • ??
  • extern?char?a;??
  • void?msg();??
  • ??
  • #endif??
  • [cpp]?view plaincopy
  • #include?<stdio.h>??
  • #include?"a.h"??
  • ??
  • //b.c??
  • int?main()??
  • {??
  • ?????printf("%c?",?a);??
  • ?????msg();??
  • ?????return?0;??
  • }??
  • 以上代碼成功編譯連接后,輸出 A Hello。

    我們知道,所有未加static前綴的全局變量和函數都具有全局可見性,其它的源文件也能訪問。此例中,a是全局變量,msg是函數,并且都沒有加static前綴,因此對于另外的源文件b.c是可見的。

    但是,如果加了static,就會對其它源文件隱藏。例如在a和msg的定義前加上static,b.c就看不到它們了。利用這一特性可以在不同的文件中定義同名函數和同名全局變量,而不必擔心命名沖突


    2、靜態的局部變量

    static局部變量在函數內定義,它的生存期為整個程序運行過程,但是其作用域仍與自動變量相同,只能在定義該變量的函數內使用該變量。退出該函數后, 盡管該變量還繼續存在,但不能使用它。

    舉個例子:

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • int?fun(){??
  • ????static?int?count?=?10;???????//在第一次進入這個函數的時候,變量a被初始化為10!并接著自減1,以后每次進入該函數,a??
  • ????return?count--;??????????????//就不會被再次初始化了,僅進行自減1的操作;在static發明前,要達到同樣的功能,則只能使用全局變量:??????
  • ??
  • }??
  • ??
  • 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;??
  • }??

  • 輸出如下:



    基于以上兩點,我們得出:把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域,?限制了它的使用范圍。因此static 這個說明符在不同的地方所起的作用是不同的。


    3、未手動初始化的static變量和全局變量默認初始化為0

    未手動初始化的static變量和全局變量都存儲在 BSS 段,該區域的變量的值都為0。

    某些時候這一特點可以減少程序員的工作量。比如初始化一個稀疏矩陣,我們可以一個一個地把所有元素都置0,然后把不是0的幾個元素賦值。如果定義成靜態的,就省去了一開始置0的操作。再比如要把一個字符數組當字符串來用,但又覺得每次在字符數組末尾加‘\0’;太麻煩。如果把字符串定義成靜態的,就省去了這個麻煩,因為那里本來就是‘\0’;不妨做個小實驗驗證一下。

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • int?a;??
  • ??
  • int?main()??
  • {??
  • ?????int?i;??
  • ?????static?char?str[10];??
  • ?????printf("integer:?%d;?string:?(begin)%s(end)",?a,?str);??
  • ?????return?0;??
  • }??
  • 運行結果為:integer: 0; string: (begin) (end)

    總結

    以上是生活随笔為你收集整理的【C/C++】关键字static的全部內容,希望文章能夠幫你解決所遇到的問題。

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