第8章 變數的儲存型別

2022-06-21 05:00:14 字數 1967 閱讀 8890

自動變數(區域性變數)

函式內部定義的變數被稱為自動變數,用關鍵字auto表示

一般使用的都是自動變數,auto int x; 相當於 int x;

作用域侷限於函式之內,當函式被呼叫時,在棧區為其分配記憶體空間,生命期在函式呼叫期間

形參也是自動變數

所有函式共享棧,所以函式結束後,自動變數無法保持其值

在c語言中,自動變數沒有預設初值

外部變數(全域性變數)

在函式外部定義的變數稱為外部變數,關鍵字extern表示

生命期和作用域為全域性,被存放在記憶體的全域性資料區,生命期為程式的整個執行期間

預設初值為0

乙個外部變數通常要經過 定義變數 和 說明變數 後才能使用

使用外部變數時,應當在函式內作引用說明,即extern int a;  a=100;

如果在同乙個源程式檔案內,則可以省略引用說明,直接 a=100;

意味著,不同檔案可以互相呼叫外部變數,但是必須作引用說明

命名重複時,自動變數會遮蔽外部變數

靜態變數

static int number;

編譯程式會為靜態變數分配乙個固定的資料區儲存空間,其儲存特點(生命期、初始化等)與外部變數相同;

值在整個程式的執行期間都被保留

初始化為0

靜態變數又分為內部靜態變數和外部靜態變數

外部靜態變數與外部變數差別在於,前者只對本源程式檔案有效,對其他檔案無需,後者對所有檔案都有效;

可以將函式定義為靜態函式,使得其作用域僅限於本源程式檔案內

暫存器變數

register int x;

目的:提高經常使用的變數的訪問速度

實質:編譯程式將變數存放在cpu暫存器中,而不放在記憶體中

限制:由於暫存器長度的限制,暫存器變數只能用於整型(位長度不能超過暫存器位長度)和字元型;

暫存器變數的數目收到機器型別的限制,多的暫存器變數將被自動轉換成自動變數;因此暫存器變數的定義是乙個請求,而不是命令;

暫存器變數無初值,可以作形參

void func(static int a);  報錯

void func(register int a);  通過

外部和靜態只一次初始化;區域性和暫存器每呼叫一次函式都初始化一次;

動態記憶體分配函式

兩種記憶體分配方式

靜態分配:上述四種,預先分配一次記憶體,執行過程中不能變動,預先確定大小;

動態分配:堆中進行;優點:1、程式執行的不同階段,同一記憶體能為程式的不同部分服務;2、允許建立鍊錶;

常用動態分配函式

1、malloc(size):分配大小為size位元組的記憶體空間

原型:void malloc(unsigned size);

返回值是無型別的指標,所以需要強制轉換;

2、calloc(n, size):分配n個具有size位元組的記憶體空間

3、realloc(ptr, size):改變已分配的儲存空間

4、free(ptr):釋放由指標訪問的儲存空間

原型:void free(void *ptr);

放在stdlib.h中

:程式檢查記憶體中自由儲存空間的大小

第8章 函式 五 變數的分級保護

80368704 qq.com 上一節我們在全域性變數和區域性變數難以取捨的矛盾中結束,其實在現實世界中,存在著許多矛盾,他們是如此的對立,但是又同時存在,缺一不可.比如 生和死,甜和苦,真和假,男和女,笑和苦,實在是太多了,他們是對立著,同時又統一著,不是嗎?人分男和女 人人生娃,都想要男的,沒有...

變數的儲存型別

曾巨集安,華清遠見嵌入式學院 講師。我們在程式中會經常定義一些變數來儲存和處理資料。從本質上看,變數代表了一段可操作的記憶體,也可以認為變數是記憶體的符號化表示。當程式中需要使用記憶體時,可以定義某種型別的變數。此時編譯器根據變數的資料型別分配一定大小的記憶體空間。程式就可以通過變數名來訪問對應的記...

變數的儲存型別

儲存型別是從變數的存在時間 即生存期 來劃分變數。變數的儲存型別可分為靜態儲存方式和動態儲存方式。對於動態儲存變數,當程式執行到該變數處時才為其分配儲存空間,當程式執行到該變數所在作用域的結束處時自動收回為其分配的儲存空間,因此它的生存期為所在作用域。在程式開始就執行就為其分配儲存空間,直到程式結束...