內容概要
一、區域性變數、全域性變數與作用域
二、生存週期和儲存型別
三、銜接屬性
1、區域性變數、全域性變數與作用域
作用域規定了元素作用的範圍,這樣讓程式變得更有序
c語言作用域有4中,分別為
**塊作用域
檔案作用域
原型作用域
函式作用域
-**塊作用域
與python不同,python中**塊是通過縮排區分的;而c語言是通過大括號進行區分
c語言中在不同**塊定義的變數是互不影響的
#include int這種區分也體現在for迴圈中,注意()定義的i也屬於下乙個**塊main(void)
printf(
"i3:%d\n
",i);
}printf(
"i4:%d\n
",i);
return0;
}
#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-extern儲存型別);void add(void
)int main(void
)
printf(
"%d\n
",count); //[error] 'count' was not declared in this scope變數未定義
return0;
}
extern可以修飾變數的宣告,使得變數可以在其它檔案作用域下定義
同時編譯執行兩個檔案
a.c
int i = 10;b.c
#include int main(void將b.c稍加修改之後 **待實操**)
#include int main(void使用extern的函式依舊無法使用其它**塊下的變數定義)
#include int main(void-typeof儲存型別)
return0;
}
**待補充**
3、鏈結屬性
鏈結屬性說明了
鏈結屬性,分為3種
-external鏈結屬性
在檔案作用域下定義的變數或者函式預設的鏈結屬性就是external屬性
#include int i = 10;//-internal鏈結屬性等價於extern int i = 10;
a.c
staticb.cint i = 20; //在檔案作用域下使用static將變數鏈結屬性改為internal
#include int main(void-none空鏈結屬性)
拒絕所有除非下層**塊作用下元素的訪問
***待補充***
JS 作用域 變數 (待完善)
js 作用域 定義 名字的有效範圍 目的 提高 可靠性,避免命名衝突 辨析 全域性作用域 範圍 整個script 標籤 單獨的js 檔案 區域性作用域 函式作用域 在函式內部有效 不同作用域下,變數名可重複,且都有效 全域性作用域的變數名在區域性作用域內是有效的 函式外部無法訪問函式內部的變數 因為...
diff命令 待完善
diff命令在最簡單的情況下,比較給定的兩個檔案的不同。如果使用 代替 檔案 引數,則要比較的內容將來自標準輸入。diff命令是以逐行的方式,比較文字檔案的異同處。如果該命令指定進行目錄的比較,則將會比較該目錄中具有相同檔名的檔案,而不會對其子目錄檔案進行任何比較操作。來自 diff命令在最簡單的情...
頁面效能 待完善
本文是學習慕課網上課程前端跳槽面試必備技巧的學習筆記,便於之後複習。本文說明頁面效能的方法 資源壓縮合併,減少http請求 非核心 非同步載入 非同步載入的方式 非同步載入的區別 利用瀏覽器快取 很關鍵的一步 快取的分類 快取的原理 使用cdn 預解析dns 標籤在很多瀏覽器中預設開啟預解析 如果是...