1. 程式人生 > >C語言中不同型別變數的解讀

C語言中不同型別變數的解讀

C語言中變數分為四類,分別是

  • auto 自動變數
  • static 靜態存貯分配變數(又分為內部靜態和外部靜態)
  • extern 全域性變數(用於外部變數說明)
  • register 暫存器變數(分配在硬體暫存器中)

四大類,所有變數必須先說明(定義),後使用

自動變數(區域性變數)

區域性變數:在一個函式開頭或段開頭處說明的變數,它有幾個特徵:

  • 作用域為定義它的函式
  • 編譯器不會對自動變數給予隱含的初值,故其值不確定,因此每次使用前必須明確的置初值。
  • 形參是自動變數,作用域僅限於相應函式內
  • 自動變數隨函式的引用而存在和消失,由一次呼叫到下一次呼叫之間不保持值。
#include <stdio.h>  
void print_number (int x, int y) { int m,sum; for(m = x;m<y;m++) { sum +=m; } printf("%d\n",sum); } void main(void) { print_number(3,5); print_number(3,5); }
  • 這個程式列印的值均不正確,因為sum未賦初值,
    造成了列印的數為隨機數。 我們把sum賦初值為0再執行以下,結果就正確了。
  • 這個程式說明區域性變數必須要先賦初值再使用,另外說明區域性變數的生命週期為函式呼叫時開始,函式呼叫完成時消亡。

外部變數:

  • 在函式外部定義的變數即為外部變數,它的作用域是整個程式(全程變數,也就是全域性變數)。

  • 全域性變數的作用範圍是整個程式(如果程式是多個檔案,必須在其他的檔案中說明,其實說明方法就是新增extern關鍵字)

  • c程式可以分別放在幾個檔案上,每個檔案可以作為一個編譯單位分別進行編譯。外部變數只需在某個檔案上定義一次,其它檔案若要引用此變數時,應用extern加以說明(外部變數定義時不必加extern關鍵字)。

  • 在同一檔案中,若前面的函式要引用後面定義的外部(在函式之外)變數時,在函式里加extern加以說明。

引進外部變數的原因:解決函式單獨編譯的協調;與變數初始化有關;外部變數的值是永久的;解決資料共享;
注意:函式本身也被認為是外部變數

靜態變數:

  • 分為內部靜態變數和外部靜態變數
  • 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式
  • 內部靜態變數:

    • 在區域性變數前加上static就為內部靜態變數
    • 靜態區域性變數仍是區域性變數,其作用域仍在定義它的函式範圍內,但它採用靜態存貯分配(由編譯程式在編譯時分配,而一般的自動變數和函式形參均採用動態存貯分配,即在執行時分配空間),當函式執行完,返回呼叫點時,該變數並不撤銷,再次呼叫時,其值將繼續存在。
    • 內部靜態變數也稱作區域性靜態變數
  • 外部靜態變數:

    • 在函式外部定義的變數前加static即為外部靜態變數
    • 作用域為定義它的檔案,即成為該檔案的私有變數,其他檔案上的函式一律不得直接訪問,除非通過它所在檔案上的函式進行操作,這可實現資料隱藏。
      外部靜態變數也稱為靜態全域性變數。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用在定義它的那個檔案裡,卻不能用在程式中的其他檔案裡。它是定義儲存因型為靜態型的外部變數,其作用域是從定義點到程式結束,所不同的是儲存型別決定了儲存地點,靜態型變數是存放在記憶體的資料區中的,它們在程式開始執行前就分配了固定的位元組,在程式執行過程中被分配的位元組大小是不改變的,只有程式執行結束後,才釋放所佔用的記憶體。

暫存器變數:

  • 只有自動(區域性)變數和函式引數才能進一步指定為暫存器存貯類
    • 使用register變數可以提高存取速度,但暫存器變數的數目依賴於具體機器,宣告多了也只有前幾個有效。
    • 只限於int,char,short ,unsigned和指標型別用寄存類。
    • .不能對register變數取地址(即&操作)

變數的初始化:

  • 外部變數和靜態變數由編譯程式給予隱含的初始值0;
  • 區域性變數的初始化每進入函式便初始化一次。
  • 外部或靜態變數僅在編譯時初始化一次。
  • 自動變數或暫存器變數只能顯示初始化,否則將有不確定的值。
  • 外部資料的說明,如果帶有初始化項,則當成一個定義。
  • 在c語言中函式不能巢狀定義,但是變數可以巢狀定義。

各種變數在記憶體的位置

  • 區域性變數儲存在堆疊中,也就是在棧區內。無論區域性變數顯示初始化,或者未初始化,都只有當定義它們的程式塊被呼叫時(即執行時),才分配空間,宣告或定義時並不分配,區域性變數不是可執行模組的一部分!!除非顯示地對區域性變數進行初始化,否則,它們的初始值是不確定的。

  • 全域性變數沒有宣告在任何一個函式內,作用範圍在程式執行始終存在。能被同一原始檔的任何函式使用,也能被其他檔案中的函式使用,但要使用extern關鍵字(這裡再重複一遍,前邊已經說明了一次)。全域性變數儲存在資料段中。全域性變數顯示初始化時(如b),或者未初始化時(如a),在程式映像中有不同的分割槽:已初始化的全域性變數是可執行模組的一部分。未初始化的全域性變數則不是可執行模組的一部分,只有當定義它們的程式被呼叫時(即執行時),才分配空間,宣告或定義時並不分配。未初始化的全域性變數在執行時被初始化為0。

  • 靜態變數,用static關鍵字定義的變數,與區域性變數相比, static區域性變數以下不同:

    • 儲存空間分配不同,auto型別分配在棧上,屬於動態儲存類別,佔動態儲存區空間,函式呼叫結束後自動釋放, 而static分配在靜態儲存區,在程式整個執行期間都不釋放,兩者之間的作用域相同,但生存期不同;
    • static區域性變數在所處模組在初次執行時進行初始化工作,且只操作一次;

注意:對於外部(全域性)變數,不論是否有static限制,它的儲存區域都是在靜態儲存區,生存期都是全域性的。此時的static只是起作用域限制作用,限定作用域在本模組(檔案)內部。靜態全域性變數與全域性變數的差別是:靜態全域性變數只能被同一原始檔中的函式呼叫,其他檔案中的函式不能呼叫靜態全域性變數。

相關推薦

C語言不同型別變數解讀

C語言中變數分為四類,分別是 auto 自動變數 static 靜態存貯分配變數(又分為內部靜態和外部靜態) extern 全域性變數(用於外部變數說明) register 暫存器變數(分配在硬體暫存器中) 四大類,所有變數必須先說明(定義

C語言不同型別資料所佔位元組數彙總

16位編譯器         char:1個位元組         char*:2個位元組         short int:2個位元組         int:2個位元組         unsigned int:2個位元組         long:4個位元組         long long:8個位

深度解說C語言整形型別在記憶體

資料型別在記憶體中的大小一般不變,與32位、64位平臺無關;只有指標與平臺有關。32位平臺下,所有指標型別均佔4個位元組。 一、void型別 void型別稱為空型別(無型別),一般作為函式的返回時使用。 那麼void能否定義變數呢? 答案是否定的。因為資料型別在

C++語言的外部變數引用和char[],char*的若干問題探究

今天覆習了一下C++的知識點,發現了一些有疑問的地方,查看了一些資料,得到一些結論,記錄下來。1,如果在一個工程目錄下,存在多個頭檔案,這些標頭檔案裡面是否可以包含相同的變數名呢?思考:標頭檔案給我們的資訊其實就是介面資訊,我們呼叫一個頭檔案其實就是呼叫跟它相關的原始檔,原始

C語言資料型別的本質

  資料型別可以理解為固定記憶體大小的別名。比如int型別,就是表示佔用4位元組的記憶體。 1 資料型別的大小   用sizeof操作符獲得資料型別的大小。    比如 int a[5];   sizeof(a)就可以得出int型陣列a的大小是20位元組

C語言結構體變數之間賦值

/********************************************************************** * 版權所有 (C)2015, Zhou Zhaoxiong。 * * 檔名稱:Struct2Struct.c * 檔案標識:無 * 內容摘要:結構體變數之間的賦值

C語言使用環境變數的技巧

例項1: 程式readenv.c顯示了在c語言中存取環境變數的若干技巧。該程式將以與dos的SET命令相同的格式打印出當前所有的環境變數,然後尋找PATH變數,打印出整個路徑字串。該程式中有兩個重要的子程式,find_env_string(),它的主要作用是:根據從呼叫這傳來

C語言的靜態變數和普通變數的區別

下面用程式碼說明: 一個可執行程式包括BSS段、資料段、程式碼段(文字段)。 bss segment ,data segment ,code/text segment ①BSS(Block by Start Symbol) :通常指用來存放程式中未初化的全域性變數和靜態變數

C語言資料型別總結

1.c語言的資料型別的分類: 分為四大類:基本資料型別、指標型別、空型別、構造型別。 基本資料型別:整型(int)、單精度浮點型(float)、雙精度浮點型(double)、字元型(char); 注:

關於C語言返回區域性變數和區域性指標變數

char *test1(void) { char b[10] = "abcde"; return b; } char *test1_ver2(void) { static char b[10] = "abcde"; return b; } char *test2(voi

C語言型別提升——基礎概念,但還有很多人搞不清

每天都會看CU的部落格,尤其是CU首頁上面的部落格。個人感覺有很多同學並不關注基礎知識, 在遇到問題時,經常會捨本求末。遇到問題,總是找不到根本原因,得出了一些結論。但這些結論並不是真正的原因,整個兒過程,也把真正的原因給掩蓋了。 今天主要說一下C語言的型別提升的事

C語言常量和變數

在C語言中,常量和變數都是可以用來儲存和表示資料的,常量值在程式執行的過程中是不可變的,而變數是可變的 1,常量的概念 常量是不可變的量,C語言中數值可以用常量表示,常量可以表示各種資

C語言型別轉換與資料的機器碼儲存

各種型別的表示範圍 對於涉及到了混合著不同資料型別的表示式中的資料型別的轉換問題。在總結轉換問題之前,先說明一下32位機上的各種資料型別。 型別名 位元組數 其他型別名 10進製表示範圍(機器碼) char 1 signed char -128

[c]c語言可不可以用變數定義陣列的個數

C語言中不可以用變數定義陣列的個數。 原因如下: 由於陣列在定義的時候,系統就會分配對應的儲存單元,如果用變數,系統就不知道該分配多少位元組的儲存單元,就會報錯。 但可以先定義一個希望陣列型別的指標,使用的時候動態申請變數所表示的大小,並賦值給前定義指標,申請成功後就可

C語言基本型別char、short、int、long等型別的取值範圍

        在C語言中,有時候會想知道這些基本型別的取值範圍。用邏輯位操作的方法是可以,比如把整型變數的所有位都賦值1,然後把最高位賦值為0,就可以得到整型的最大值了。         其實,還有一個更簡單的方法獲取這些基本型別的取值範圍。那就是使用系統標頭檔案limi

C語言的字元變數和字元常量

字元變數與字元常量定義   1.字元變數:char型別定義的變數   2.字元常量:一個字元常量代表ASCII字符集中的一個字元,在程式中用單引號把一個字元括起來作為字元常量 字元常量的表示形式   1.用字元的圖形符號表示,如:‘a’,‘y’   2.直接用十進位制的資料

C語言實現多種型別變數的混合輸出

來源:大工慕課 連結 作者:Caleb Sung 題目要求 練習各種型別變數的輸出。 解答示範 #include <stdio.h> int main () {

c語言的全域性變數與區域性變數

全域性變數 在函式外面定義的變數,可以為本檔案中其他函式所公用,他的有效範圍為定義的位置開始一直到本原始檔結束,即main函式結束。 區域性變數和外部變數同名時,在區域性變數的範圍內,外部變數不起作用。 全域性變數的儲存方式:一般來說全域性變數都是存放在靜態儲存

c語言型別所佔位元組大小

32位編譯器 char :1個位元組 char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器) short int : 2個位元組 int: 4個位元組 unsigned int : 4個位元組 float:

c語言靜態全域性變數、靜態區域性變數、全域性變數、區域性變數、巨集

全域性變數: 全域性變數具有全域性作用域。,它只編譯期被始化一次,它不能用變數來初始化。全域性變數只需要在一個原始檔中定義,就可以作用於所有的原始檔。在其他不包含全域性變數定義的原始檔中需要用extern關鍵詞來再次宣告這個全域性變數 區域性變數: 區域性變數只有區域性