嵌入式開發之Linux系統中C語言變量

請大家關注點贊,已經完成物聯網相關開發,會從硬件層,硬件中間層,傳輸層,軟件中間件(物聯網雲平臺),APP開發相關博文。首先從嵌入式開發博文開始!上一節關於<>。本節關於Linux系統中C語言變量。

變量其實只不過是程序可操作的存儲區的名稱。C 語言中每個變量都有特定的類型,類型決定了變量存儲的大小和佈局,該範圍內的值都可以存儲在內存中,運算符可應用於變量上。變量的名稱可以由字母、數字和下劃線字符組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為 C 是大小寫敏感的。

1、變量的基礎

變量在程序中用變量名錶示。變量名由用戶根據其用途任意命名。變量名由字母、數字、下劃線組成,不能以數字開頭,不能和C的關鍵字重名。在程序運行中,變量佔據存儲空間的大小由其數據類型大小決定。具體參見《嵌入式開發之Linux系統中C語言數據類型》查看了解。變量在內存空間的首地址,稱為變量的地址。

對於基本數據類型,有以下幾種基本的變量類型:

嵌入式開發之Linux系統中C語言變量

幾種基本的變量類型


C 語言也允許定義各種其他類型的變量,比如枚舉、指針、數組、結構、共用體等等,這將會在後續的節中進行講解,本節我們先講解基本變量類型。

2、變量的說明

變量在程序運行中,必須首先預先說明其存儲類型和數據類型。

1)變量說明的一般形式:

存儲類型,在 C 程序中變量/函數的範圍(可見性)和生命週期。C 程序中可用的存儲類:auto、register、static、extern。

數據類型,可以是基本數據類型,也可以是自定義數據類型。

2)變量定義

變量定義就是告訴編譯器在何處創建變量的存儲,以及如何創建變量的存儲。變量定義指定一個數據類型,幷包含了該類型的一個或多個變量的列表,如下所示:

type variable_list;

在這裡,type 必須是一個有效的 C 數據類型,可以是 char、w_char、int、float、double 或任何用戶自定義的對象,variable_list 可以由一個或多個標識符名稱組成,多個標識符之間用逗號分隔。

舉例:

int i, j, k;

char c, ch;

float f, salary;

double d;

int i, j, k; 聲明並定義了變量 i、j 和 k,這指示編譯器創建類型為 int 的名為 i、j、k 的變量。

變量可以在聲明的時候被初始化(指定一個初始值)。初始化器由一個等號,後跟一個常量表達式組成,如下所示:

type variable_name = value;

舉例:

extern int d = 3, f = 5; // d 和 f 的聲明與初始化

int d = 3, f = 5; // 定義並初始化 d 和 f

byte z = 22; // 定義並初始化 z

char x = 'x'; // 變量 x 的值為 'x'

不帶初始化的定義:帶有靜態存儲持續時間的變量會被隱式初始化為 NULL(所有字節的值都是 0),其他所有變量的初始值是未定義的。

變量聲明向編譯器保證變量以指定的類型和名稱存在,這樣編譯器在不需要知道變量完整細節的情況下也能繼續進一步的編譯。變量聲明只在編譯時有它的意義,在程序連接時編譯器需要實際的變量聲明。

A一種是需要建立存儲空間的。例如:int a 在聲明的時候就已經建立了存儲空間。

B另一種是不需要建立存儲空間的,通過使用extern關鍵字聲明變量名而不定義它。 例如:extern int a 其中變量 a 可以在別的文件中定義的。

除非有extern關鍵字,否則都是變量的定義。

extern int i; //聲明,不是定義

vaiable/demo.c例子:

嵌入式開發之Linux系統中C語言變量

demo.c例子


3、變量的存儲類型

1)auto 存儲類

auto 存儲類是所有局部變量默認的存儲類。在函數體內,說明auto類型的存儲變量時,可以省略auto。如下:

{

auto int k;

int j;

double x;

}

auto 只能用在函數內,即 auto 只能修飾局部變量。

vaiable/auto.c例子:

嵌入式開發之Linux系統中C語言變量

auto.c例子


2)register 存儲類

register稱為寄存器型,register變量是想將變量放入CPU的寄存器中,這樣可以加快程序的運行速度。如果申請不到,就一般使用內存,如同auto。register 存儲類用於定義存儲在寄存器中而不是 RAM 中的局部變量。register變量必須是能被CPU所接受的的類型。這通常意味著register變量必須是一個單個的值,並且長度應該小於或者等於整型的長度。不能用”&”來獲取register變量的地址。

{

register int miles;

}

寄存器只用於需要快速訪問的變量,比如計數器。還應注意的是,定義 'register' 並不意味著變量將被存儲在寄存器中,它意味著變量可能存儲在寄存器中,這取決於硬件和實現的限制。

3)static 存儲類

static 變量稱為靜態存儲類型變量,既可以存在函數體內(局部變量),也可以在函數體外說明(全局變量),默認為0。static 存儲類指示編譯器在程序的生命週期內保持局部變量的存在,而不需要在每次它進入和離開作用域時進行創建和銷燬。因此,使用 static 修飾局部變量可以在函數調用之間保持局部變量的值。static 修飾符也可以應用於全局變量。當 static 修飾全局變量時,會使變量的作用域限制在聲明它的文件內。全局聲明的一個 static 變量或方法可以被任何函數或方法調用,只要這些方法出現在跟 static 變量或方法同一個文件中。static 說明為全局變量時,其他文件不能引用。

vaiable/static.c例子

嵌入式開發之Linux系統中C語言變量

static.c例子未賦值


嵌入式開發之Linux系統中C語言變量

static.c例子賦值


4)extern 存儲類

extern稱為外部參照引用型,使用extern說明的變量為引用在其他文件中函數體外說明的變量。當變量在一個文件的函數體外(全局變量),所有其他文件中的函數或程序段都可以引用這個變量。extern 存儲類用於提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。當您使用 extern 時,對於無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。當您有多個文件且定義了一個可以在其他文件中使用的全局變量或函數時,可以在其他文件中使用 extern 來得到已定義的變量或函數的引用。可以這麼理解,extern 是用來在另一個文件中聲明一個全局變量或函數。extern 修飾符通常用於當有兩個或多個文件共享相同的全局變量或函數的時候。

vaiable/extern_main.c

vaiable/extern_support.c

嵌入式開發之Linux系統中C語言變量

extern例子


在這裡,第二個文件中的 extern 關鍵字用於聲明已經在第一個文件 extern_main.c 中定義的 count。現在 ,編譯這兩個文件,如下所示:

$ gcc extern_main.c extern_support.c

這會產生 a.out 可執行程序,當程序被執行時,它會產生下列結果:

count is 5

例子中涉及指令請查看前幾節相關博文。


分享到:


相關文章: