部分c語言知識總結

2020-08-13 11:42:47

部分c語言知識總結(一)

持續更新ing

1.extern關鍵字的作用
1.參照同一個檔案中的變數
2.參照不同檔案中的變數
3.參照不同檔案中的函數(需要指明函數型別和返回值)
2. 全域性變數可不可以定義在可被多個.C 檔案包含的標頭檔案中?爲什麼?
答 、可以,在不同的 C 檔案中以 static 形式來宣告同名全域性變數。可以在不同的 C 檔案中宣告同名的全域性變數,前提是其中只能有一個 C 檔案中對此變數賦初值,此時連線不會出錯。
3.statac 全域性變數、區域性變數、函數與普通全域性變數、區域性變數、函數
static 全域性變數與普通的全域性變數有什麼區別? static 區域性變數和普通區域性變數有什麼區別? static 函
數與普通函數有什麼區別?

答:非靜態全域性變數本身是靜態儲存方式,儲存在數據段(初始化的)或者bss段(未初始化或者初始化爲0的),加上static仍然也是靜態儲存方式(存放在數據段或者bss段),非靜態全域性變數的作用域是整個源程式,當有多個原始檔時,其他檔案也可以使用,靜態全域性變數的作用域是單獨該原始檔。
非靜態區域性變數的作用域和時域都是該函數體,儲存在棧中,靜態區域性變數作用域還是該函數體,但時域是整個原始檔,儲存再數據段中;
普通函數(整個源程式)和static函數(單獨該原始檔)的作用域不同;
static 全域性變數和普通全域性變數有什麼區別:static全域性變數只初始化一次,防止在其他檔案中被參照;
static 區域性變數和普通區域性變數有什麼區別:static區域性變數只初始化一次,下一次根據上一次的結果;
static 函數與普通函數有什麼區別:static函數在記憶體中只有一份,普通函數每次在記憶體中維持一分拷貝;
4.程式的記憶體分配
答:一個由 C/C++編譯的程式佔用的記憶體分爲以下幾個部分
1、棧區( stack) 由編譯器自動分配釋放,存放函數的參數值,區域性變數的值等。其操作方式類似於數據結構中的棧。
2、堆區(heap) 一般由程式設計師分配釋放(malloc、free等),若程式設計師不釋放,程式結束時可能由 OS 回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
3、全域性區(靜態區)( static) 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域(數據段),未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域(BSS段)。程式結束後由系統釋放。
4、文字常數區 常數字串就是放在這裏的。程式結束後由系統釋放。
5、程式程式碼區 存放函數體的二進制程式碼

例子程式
這是一個前輩寫的,非常詳細
//main.cpp
int a=0; //全域性初始化區
char *p1; //全域性未初始化區
main()
{
intb;char s[]="abc"; //棧
char *p2; //棧
char *p3="123456"; //123456\0 在常數區, p3 在棧上。
static int c=0//全域性(靜態)初始化區
p1 = (char*)malloc(10);
p2 = (char*)malloc(20); //分配得來得 10 和 20 位元組的區域就在堆區。
strcpy(p1,"123456"); //123456\0 放在常數區,編譯器可能會將它與 p3 所向"123456"優化成一
個地方。
}