隨著工作中瑣事越來越多,靜下來好好敲代碼的時間越來越少,基礎知識雖然簡單,但常看常新,并記錄下來共勉。
一、基礎知識點
1. 內存區域中數據管理
在C和C++中,內存分為多個區域,每個區域負責存儲不同類型的數據。以下是對不同存儲區域的簡要說明:
(1)靜態區域(Static Memory)
- 存儲內容:靜態區域用于存儲程序的全局變量、靜態變量和常量(
const
修飾的變量)。這些變量的生命周期從程序開始到程序結束。 - 存儲位置:靜態變量和常量存儲在靜態數據區,通常包括:
- 全局變量:存儲在靜態數據區中,程序運行時一直存在。
- 靜態局部變量:通過
static
關鍵字聲明的局部變量,存儲在靜態數據區,不會在函數調用結束時銷毀。 - 常量:如果常量是全局常量或者在程序中明確作為常量定義,它通常也存儲在靜態數據區。
(2) 堆(Heap)
- 存儲內容:堆是程序運行時動態分配內存的區域。它主要用于存儲通過
malloc
、new
等動態內存分配函數分配的內存。堆中的內存需要手動釋放(如通過free
、delete
)。 - 存儲位置:堆中的內存位置是動態的,且程序可以在運行時隨時進行分配和釋放。因此,它適合存儲大小不固定或者需要在運行時決定存儲空間的數據結構(如鏈表、樹等)。
(3) 棧(Stack)
- 存儲內容:棧主要用于存儲函數的局部變量、函數的返回地址以及函數的調用信息(如函數調用時保存的寄存器等)。當函數被調用時,棧會為該函數分配空間,函數返回時,棧空間會被自動釋放。
- 存儲位置:棧上的變量具有“自動存儲持續性”,即它們的生命周期僅限于函數的調用周期。棧存儲的變量通常是臨時的、局部的變量。棧的內存分配和釋放由編譯器自動管理,不需要手動干預。
總結:
- 靜態區域:全局變量、靜態變量、常量。
- 堆:動態分配的內存(通過
malloc
、new
等)。 - 棧:函數局部變量、函數調用信息。
每個區域的存儲方式和管理方式有所不同,棧和堆是由程序運行時進行管理的,而靜態區域則在程序啟動時分配并在程序退出時釋放。
2. 全局變量、靜態變量、常量的區別
在C和C++中,全局變量、靜態變量和常量有著不同的特性和用途。以下是它們的主要區別:
(1) 全局變量(Global Variables)
- 定義:全局變量是在所有函數外部定義的變量,通常定義在源文件的最外層。
- 生命周期:全局變量的生命周期從程序開始執行到程序結束。
- 作用域:全局變量的作用域是整個程序,任何函數都可以訪問和修改全局變量。
- 存儲位置:全局變量通常存儲在靜態數據區(BSS段或數據段),并且在程序開始時被初始化。
- 初始化:如果沒有顯式初始化,全局變量會被自動初始化為零(對于基本數據類型)。
示例:
int globalVar = 10; // 全局變量void foo() {globalVar = 20; // 可以在函數中訪問和修改全局變量
}
(2) 靜態變量(Static Variables)
- 定義:靜態變量是在函數內部或外部使用
static
關鍵字聲明的變量。對于函數內部的靜態變量,它的生命周期與程序的生命周期相同,但它的作用域僅限于函數內部。 - 生命周期:靜態變量的生命周期從程序開始執行到程序結束,即使是局部靜態變量,它也不會在函數調用結束時銷毀。
- 作用域:
- 局部靜態變量:僅限于聲明它的函數內部,其他函數無法訪問。
- 全局靜態變量:作用域僅限于聲明它的源文件,其他源文件無法訪問(這時它是一個文件內部的全局變量,具有“內聯”特性)。
- 存儲位置:靜態變量存儲在靜態數據區(BSS段或數據段)。
- 初始化:靜態變量在程序啟動時自動初始化為零,如果顯式初始化則使用指定的值。
示例:
void foo() {static int counter = 0; // 靜態局部變量counter++;printf("Counter: %d\n", counter);
}
每次調用foo()
時,counter
會保留其上次的值,而不像普通局部變量那樣每次進入函數時都會被重新初始化。
(3) 常量(Constants)
- 定義:常量是指值在程序運行時不能修改的變量。常量可以使用
const
關鍵字來聲明,或者使用#define
宏定義。 - 生命周期:常量的生命周期通常與它所在的程序區域相同,通常存儲在只讀數據區或靜態數據區中。
- 作用域:常量的作用域與其聲明的位置相關。局部常量僅限于其聲明的作用域,而全局常量可以在整個程序中訪問。
- 存儲位置:常量通常存儲在程序的只讀數據區。
- 初始化:常量在聲明時必須進行初始化,并且值在程序運行過程中不可修改。
示例:
const int MAX_VALUE = 100; // 常量,初始化后不能修改void foo() {// MAX_VALUE = 200; // 錯誤,常量不能修改
}
區別總結:
特性 | 全局變量 | 靜態變量 | 常量 |
---|---|---|---|
定義位置 | 函數外部定義 | 函數內部或外部使用static 關鍵字聲明 | 使用const 關鍵字或#define 定義 |
生命周期 | 程序從開始到結束 | 程序從開始到結束 | 程序從開始到結束 |
作用域 | 程序中的任何地方都可以訪問 | 僅限于函數或源文件 | 僅限于其聲明的作用域 |
初始化 | 如果沒有初始化,會被自動初始化為零 | 如果沒有顯式初始化,會自動初始化為零 | 必須在聲明時初始化,并且不可修改 |
存儲位置 | 靜態數據區(BSS段或數據段) | 靜態數據區(BSS段或數據段) | 靜態數據區或只讀數據區 |
是否可修改 | 可修改 | 可修改(局部靜態變量,除非為常量) | 不可修改 |
關鍵點:
- 全局變量:程序中的任何地方都可以訪問,生命周期貫穿整個程序。
- 靜態變量:生命周期與程序相同,但作用域受限,可以是局部的(函數內部)或全局的(僅在文件內有效)。
- 常量:值不可修改,初始化后不允許更改。