變數儲存相關(待完善)

2022-07-01 08:51:10 字數 4001 閱讀 4840

內容概要

一、區域性變數、全域性變數與作用域

二、生存週期和儲存型別

三、銜接屬性

1、區域性變數、全域性變數與作用域

作用域規定了元素作用的範圍,這樣讓程式變得更有序

c語言作用域有4中,分別為

**塊作用域

檔案作用域

原型作用域

函式作用域

-**塊作用域

與python不同,python中**塊是通過縮排區分的;而c語言是通過大括號進行區分

c語言中在不同**塊定義的變數是互不影響的

#include int

main(void)

printf(

"i3:%d\n

",i);

}printf(

"i4:%d\n

",i);

return0;

}

這種區分也體現在for迴圈中,注意()定義的i也屬於下乙個**塊

#include int

main(void)

printf(

"end : %d\n

",i);

return0;

}

-**塊變數查詢順序

與python中變數查詢順序b(內建),g(全域性),e(外部),l(區域性)類似,  **這裡忘了**

c語言中變數查詢也是按照從內往外,不走同級的規律查詢的

#include int

main(void)

}return0;

}

-區域性變數(區域性變數就可以只是指**塊作用域下的變數)

可以將區域性變數理解為定義在函式體的變數,這樣的變數其它的函式無法訪問

#include int number(void

);int number(void

)int main(void

)

-全域性變數,如果想要變數能被每乙個函式訪問,那麼就使用全域性變數,全域性變數在函式外定義

#include int global_a; //預設初始化為0;全域性變數命名最好為首字母大寫

void a(void

);void b(void

);void c(void

);void a(void

)void b(void

)void c(void

)int main(void

)

覆蓋全域性變數

#include int global_a; //

void a(void

);void b(void

);void c(void

);void a(void

)void b(void

)void c(void

)int main(void

)

-檔案作用域

全域性變數所在的作用域就是全域性作用域,它能被所有檔案中其它元素訪問

在python中內建命名空間、全域性命名空間、區域性命名空間其實並非是包含巢狀關係;

而是在記憶體中有不同的劃分,只是彼此又有關聯;

但為了方便理解,就理解為包含關係了。

c語言不知道是不是這樣 **有空去詳細了解一下**

-原型作用域

原型作用域使用的少,這個作用域適用於函式原型中的引數名

-函式作用域

函式作用域只適用於goto語句的標籤,作用是將goto標籤限制在同乙個函式中,以防出現重名標籤的情況

2、生存週期和儲存型別

c語言只有兩種生存週期

-靜態儲存期

靜態儲存期指的是從程式執行到程式結束位置,都占用著記憶體空間

一般具有檔案作用域的元素都具有靜態儲存期

-自動儲存期

自動儲存器指的是在所在**塊結束之後,自動釋放記憶體空間

一般具有**塊作用域的元素具有自動儲存器

儲存型別

對於儲存型別,我是這樣子理解的——記憶體中資料不是隨機存放的,而是經過區域劃分的,定義auto型別,就是告訴編譯器,我要將這個變數存放到哪個記憶體區域中

不同的記憶體區域對應著不同的生存期,使用者許可權,作用域等等 **這部分是要核實的**

static和extern在**塊作用域和檔案作用域下有不同功能

-auto儲存型別

定義在函式內的變數預設的儲存型別就是auto,auto儲存型別的資料具有自動儲存期、**塊作用域、none鏈結屬性

int main(void

)

-register儲存型別

使用register修飾的變數稱為暫存器變數,暫存器變數有可能儲存於暫存器中,暫存器可以理解為儲存空間非常小的記憶體,暫存器是用於存放那些頻繁被cpu使用或者是即將被cpu使用的值,

cpu與暫存器之間互動資料幾乎沒有延遲。

但由於暫存器空間非常小,一般只有乙個值,也有可能因為空間不夠,或者編譯器覺得有更好的變數應該被存放於暫存器。你所定義的暫存器變數實際不會儲存與暫存器中。

與auto儲存型別資料一樣,register儲存型別具有自動儲存期、**塊作用域、none鏈結屬性

不同的是,你無法通過&取值運算子來操作register變數   **實操在dev c++下可以取址,還能改值**

#include int main(void

)

-static儲存型別

使用static修飾乙個**塊作用域下變數,將它改變為靜態區域性變數。擁有**塊作用域,靜態儲存型別,none鏈結屬性

#include int add(void

);int add(void

)int main(void

)

return0;

}

對比

#include int add(void

);int add(void

)int main(void

)

return0;

}

嘗試訪問這個靜態區域性變數

#include void add(void

);void add(void

)int main(void

)

printf(

"%d\n

",count); //[error] 'count' was not declared in this scope變數未定義

return0;

}

-extern儲存型別

extern可以修飾變數的宣告,使得變數可以在其它檔案作用域下定義

同時編譯執行兩個檔案

a.c

int i = 10;
b.c

#include int main(void

)

將b.c稍加修改之後  **待實操**

#include int main(void

)

使用extern的函式依舊無法使用其它**塊下的變數定義

#include int main(void

)

return0;

}

-typeof儲存型別

**待補充**

3、鏈結屬性

鏈結屬性說明了

鏈結屬性,分為3種

-external鏈結屬性

在檔案作用域下定義的變數或者函式預設的鏈結屬性就是external屬性

#include int i = 10;//

等價於extern int i = 10;

-internal鏈結屬性

a.c

static

int i = 20; //在檔案作用域下使用static將變數鏈結屬性改為internal

b.c

#include int main(void

)

-none空鏈結屬性

拒絕所有除非下層**塊作用下元素的訪問

***待補充***

JS 作用域 變數 (待完善)

js 作用域 定義 名字的有效範圍 目的 提高 可靠性,避免命名衝突 辨析 全域性作用域 範圍 整個script 標籤 單獨的js 檔案 區域性作用域 函式作用域 在函式內部有效 不同作用域下,變數名可重複,且都有效 全域性作用域的變數名在區域性作用域內是有效的 函式外部無法訪問函式內部的變數 因為...

diff命令 待完善

diff命令在最簡單的情況下,比較給定的兩個檔案的不同。如果使用 代替 檔案 引數,則要比較的內容將來自標準輸入。diff命令是以逐行的方式,比較文字檔案的異同處。如果該命令指定進行目錄的比較,則將會比較該目錄中具有相同檔名的檔案,而不會對其子目錄檔案進行任何比較操作。來自 diff命令在最簡單的情...

頁面效能 待完善

本文是學習慕課網上課程前端跳槽面試必備技巧的學習筆記,便於之後複習。本文說明頁面效能的方法 資源壓縮合併,減少http請求 非核心 非同步載入 非同步載入的方式 非同步載入的區別 利用瀏覽器快取 很關鍵的一步 快取的分類 快取的原理 使用cdn 預解析dns 標籤在很多瀏覽器中預設開啟預解析 如果是...