c語言中的每個變數有兩個屬性:資料型別(整形、浮點型、字元型),還有資料儲存類別,分別為自動的(auto),靜態的(static),暫存器的(register)和外部的(extern)。下面對它們進行逐一說明:
auto型別:其實在函式中的區域性變數,不加特殊宣告,都是auto變數,但是關鍵字"auto"可以被省略。這些變數在函式被表用時分配儲存方式,函式呼叫結束後這些儲存空間就被釋放了。
static型別:被static宣告的變數為靜態變數,函式呼叫結束後,這些變數不消失,而保留當前資料,下一次呼叫時變數的值為上一次呼叫完成後的值。舉乙個例子:
[cpp]view plain
copy
intfunc()
intmain(
void
)
輸出的值依次為9,8,7,6,5,4,3,2,1,0。
這只是它最基本的用法,其實static有另外2種作用:
(1)如果給乙個全域性變數增加static,那麼這個變數只能在本檔案中使用,而不是全域性使用了:
[cpp]view plain
copy
//全域性變數
char
c =
'a';
extern
char
c;
#include "test.h"
#include
intmain(
void
)
我們在test.c中定義了全域性變數char c,然後在main.c中可以使用它。(標頭檔案裡的extern宣告後面再說。)可是如果我們在test.c中的全域性變數增加了static,那麼c就只能在test.c中使用了。
(2)將變數初始化為0。其實不光是static,全域性變數也自動初始化為0.這是因為它們是在靜態儲存區中的,那裡的所有位元組預設值都是0x00:
[cpp]view plain
copy
#include
intval;
intmain(
void
)
列印結果為0,0
register型別:register修飾符暗示編譯程式相應的變數將將被頻繁使用,如果可能的話,應將其儲存在cpu的暫存器中,以指加快其訪問速度。但是,使用register修飾符有幾點限制:
(1)只有區域性自動變數和形式引數可以作為暫存器變數,其他(如全域性變數)不行。
(2)乙個計算機系統中的暫存器數目是有限的,不能定義任意多個暫存器變數。
(3)區域性靜態變數不能定義為暫存器變數。
其實這個變數已經過時,因為現在的計算機處理速度夠快,所以很少使用.。
extern型別:它不是乙個定義,而是乙個宣告,他表示這個變數或者函式的定義在別的檔案中。從前面的例子我們可以看到。在c語言中,函式被預設定義為extern。
資料儲存型別
c語言中每個變數有兩個屬性 資料型別 整形,浮點型,字元型 還有資料儲存類別,分別為自動的 auto 靜態的 static 暫存器的 register 和外部的 extern auto型別 在函式中宣告的區域性變數,不加特殊宣告,都是auto變數,但是關鍵字 auto 可以省略。這些變數在函式被表用...
資料儲存型別選擇
冷資料,儲存在關係型資料庫中 mysql 商品描述 詳情 評價等資訊儲存在文件類資料庫中 mongodb 商品儲存在分布式檔案系統,如hadoop的hdfs中。商品的關鍵字isearch。高頻詞彙熱點資訊 tair redis memcache 記憶體資料庫。商品的交易,計算,積分累計 外部系統,第...
float型別的資料儲存方式
回顧預設轉換 byte 1b char 2b short 2b int 4b long 8b float 4b double 8b 問題 為什麼預設轉換時float型在long型後面?原因 1.他們的底層儲存結構不同 2.float型別的表示範圍比long型大 long 2 63 1 float 3...