1. 程式人生 > >static變數、static函式與普通變數、普通函式的區別

static變數、static函式與普通變數、普通函式的區別

C程式一直由下列部分組成:
      1)正文段——CPU執行的機器指令部分;一個程式只有一個副本;只讀,防止程式由於意外事故而修改自身指令;    
  2)初始化資料段(資料段)——在程式中所有賦了初值的全域性變數,存放在這裡。    
  3)非初始化資料段(bss段)——在程式中沒有初始化的全域性變數;核心將此段初始化為0。     
  4)棧——增長方向:自頂向下增長;自動變數以及每次函式呼叫時所需要儲存的資訊(返回地址;環境資訊)。      
  5)堆——動態儲存分。

全域性變數之前加上關鍵字static,全域性變數就被定義成為一個全域性靜態變數。
   1)記憶體中的位置:靜態儲存區(靜態儲存區在整個程式執行期間都存在)
  2)初始化:未經初始化的全域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
   3)作用域:全域性靜態變數在宣告他的檔案之外是不可見的。準確地講從定義之處開始到檔案結尾。

好處:
定義全域性靜態變數的好處:
<1>不會被其他檔案所訪問,修改
<2>其他檔案中可以使用相同名字的變數,不會發生衝突。

區域性靜態變數

在區域性變數之前加上關鍵字static,區域性變數就被定義成為一個區域性靜態變數。
  1)記憶體中的位置:靜態儲存區
  2)初始化:未經初始化的全域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
  3)作用域:作用域仍為區域性作用域,當定義它的函式或者語句塊結束的時候,作用域隨之結束。

 注:當static用來修飾區域性變數的時候,它就改變了區域性變數的儲存位置,從原來的棧中存放改為靜態儲存區。但是區域性靜態變數在離開作用域之後,並沒有被銷燬,而是仍然駐留在記憶體當中,直到程式結束,只不過我們不能再對他進行訪問。
當static用來修飾全域性變數的時候,它就改變了全域性變數的作用域(在宣告他的檔案之外是不可見的),但是沒有改變它的存放位置,還是在靜態儲存區中。

3. 靜態函式

在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。
  函式的定義和宣告預設情況下是extern的,但靜態函式只是在宣告他的檔案當中可見,不能被其他檔案所用。
定義靜態函式的好處:
<1> 其他檔案中可以定義相同名字的函式,不會發生衝突
<2> 靜態函式不能被其他檔案所用。 儲存說明符auto,register,extern,static,對應兩種儲存期:自動儲存期和靜態儲存期。 auto和register對應自動儲存期。具有自動儲存期的變數在進入宣告該變數的程式塊時被建立,它在該程式塊活動時存在,退出該程式塊時撤銷。
關鍵字extern和static用來說明具有靜態儲存期的變數和函式。用static宣告的區域性變數具有靜態儲存持續期(static storage duration),或靜態範圍(static extent)。雖然他的值在函式呼叫之間保持有效,但是其名字的可視性仍限制在其區域性域內。靜態區域性物件在程式執行到該物件的宣告處時被首次初始化。
由於static變數的以上特性,可實現一些特定功能。
1. 統計次數功能
宣告函式的一個區域性變數,並設為static型別,作為一個計數器,這樣函式每次被呼叫的時候就可以進行計數。這是統計函式被呼叫次數的最好的辦法,因為這個變數是和函式息息相關的,而函式可能在多個不同的地方被呼叫,所以從呼叫者的角度來統計比較困難。

相關推薦

CentOS 管道符重定向環境變數

CentOS 管道符、重定向與環境變數 1. 輸入輸出重定向 2. 管道命令符 3. 命令列的萬用字元 4. 常用的轉義字元 5. 重要的環境變數 1. 輸入輸出重定向 檔案讀寫操作有關的重定向

系統學習機器學習之特徵工程(二)--離散型特徵編碼方式:LabelEncoderone-hot變數*

轉自:https://www.cnblogs.com/lianyingteng/p/7792693.html 在機器學習問題中,我們通過訓練資料集學習得到的其實就是一組模型的引數,然後通過學習得到的引數確定模型的表示,最後用這個模型再去進行我們後續的預測分類等工作。在模型訓練過程中,我們會對訓練

執行緒互斥鎖條件變數例項理解

互斥鎖: 初始化程序鎖: int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); 其中 mutex 為鎖號 attr為屬性 摧毀互

匯出私有函式私有變數

在Go語言中, package中包含函式與變數通過identifier的首字母是否大寫來決定它是否可以被其它package所訪問。當一個函式或變數名稱為小寫字母時,預設是無法被其他package引用的.  有沒有辦法突破這個限制呢?  實際上在go官方文件中已有說明, 這需要用到

管道符重定向環境變數

一、重定向 輸入重定向是把檔案匯入到命令中去,輸出重定向是把原本要輸出到螢幕的資料資訊寫入到指定檔案中去。一般,我們使用輸出重定向的頻率更高。 標準輸入重定向 :(STDIN,檔案描述符為0)預設從鍵盤輸入,也可從其他檔案或命令中輸入 標準輸出重

Linux基本知識29:重定向管道符環境變數

1 重定向 重定向技術的5中模式: 標準覆蓋輸出重定向。 標準追加輸出重定向。 錯誤覆蓋輸出重定向。 錯誤追加輸出重定向。 輸入重定向。 1.1輸入輸出重定向 (1)輸入重定向是指把檔案匯入到命令中; (2)輸出重定向則是指把原本要輸出到螢幕的資料資訊寫入到

Linux-管道符重定向環境變數

Linux 管道符、重定向與環境變數 管道命令符 管道命令符 | 的作用是將前一個目錄的標準輸出當做後一個命令的標準輸入,格式為命令A | 命令B 例如grep命令(檔案搜尋命令),通過關鍵詞

C++ 成員函式成員變數的關係

在C++中, #include <iostream> using namespace std; struct Data{ int x = 10; int y() { return 20; } }; int main

函式物件函式巢狀名稱空間作用域閉包函式裝飾器

一.函式物件 函式時第一類物件,函式可以當作資料傳遞 1.函式可以被引用 2.函式可以作為引數傳入 3.函式可以作為函式的返回值 4.函式可以作為容器型別的元素 二.函式巢狀 1.函式巢狀呼叫:在函式內又呼叫了其他函式 2.函式巢狀定義:在函式內又定義了其他函式(只能在其函式內部呼叫,在其函式

Hive常用運算(關係運算)邏輯運算數學運算數值運算日期函式條件函式字串函式

hive 常用運算 第一部分:關係運算 Hive支援的關係運算符 •常見的關係運算符 •等值比較: = •不等值比較: <> •小於比較: < •小於等於比較: <= •大於比較: > •大於等於比較: >= •空值判斷:

機器學習筆記之五——目標函式經驗風險結構風險正則項

一、常見的目標函式(loss/cost function)   二、經驗風險與結構風險    經驗風險 L(f) 就是以上損失函式,描述的是模型與訓練資料的契合程度。   結構風險Ω(f)對應於過擬合問題,用正則項解決過擬合是結構風險的課

Python基礎--可變數據類型不可變數據類型

賦值語句 一個 不同 class 內存 b- 1.7 opened 機制 可變數據類型與不可變數據類型 Python的數據類型主要分為可變數據類型與不可變數據類型,這兩種都分別包含了哪些數據類型又各自有什麽特點呢我們下邊意義介紹; 不可變數據類型:數字、字符串、元組是不可

在c++中普通函式 行內函數的區別

我們都知道編譯的最終產品是可執行程式——— 由一組由機器語言指令組成,在執行程式時,作業系統將這些指令載入到計算機記憶體中。因此,每一組指令都有一個特定的記憶體地址。 一.普通函式的呼叫 a.當代碼執

C/C++ 變數的作用域 區域性變數

區域性變數例1#include <stdio.h>#include <stdlib.h>//區域性變數例題1void changeNum1()//定義函式{    //區域性變數    //定義變數 並賦初值    int num1 = 5,num2

核心態使用者態系統呼叫函式檔案IO標準IO緩衝區等概念介紹

概述 Linux提供了兩套可以用於檔案的IO介面: 檔案IO: open、create、close、lseek、read、write、fcntl、ioctl等 標準IO: FILE、fopen、fwrite、fread、等 為了理解檔案IO和標準I

進擊的Python【第九章】:paramiko模塊線程進程各種線程鎖queue隊列生產者消費者模型

password locking form maxsize 廁所 sorted [0 hostname nbsp 一、paramiko模塊 他是什麽東西?   paramiko模塊是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的連

js正則表達式test方法exec方法字符串search方法區別

lac exec js正則 pan asc 一個數 gobject school match 1.正則表達式test方法 test() 方法用於檢測一個字符串是否匹配某個模式 返回值: 如果字符串 string 中含有與 RegExpObject 匹配的文本,則返回

函數對象函數嵌套名稱空間作用域裝飾器

choice strong .get make wrap strip 內置模塊 正是 rand 一 函數對象 一 函數是第一類對象,即函數可以當作數據傳遞 #1 可以被引用 #2 可以當作參數傳遞 #3 返回值可以是函數 #3 可以當作容器類型的元素

編譯型解釋型動態語言靜態語言強類型語言弱類型語言的區別

動態語言 動態 java語言 不同 編譯型 效率 編譯過程 .exe 檢查 (一)編譯型語言和解釋型語言   首先我們區分這樣一個概念,編譯型語言和解釋型語言。我們編程用的都是高級型語言(寫匯編和機器語言的除外),計算機只理解和運行機器語言,所以必須把高級語言翻譯成機器語言

第六篇 函數對象函數嵌套名稱空間作用域裝飾器

max 數據 多分支 數據傳遞 nbsp urn int clas 什麽 一、函數對象 函數是第一類對象,即函數可以當作數據傳遞 #1 可以被引用 #2 可以當作參數傳遞 #3 返回值可以是函數 #4 可以當作容器類型的元素 利用