前文主要介紹了C語言從零開始學習的基本框架與基礎知識導覽,本文主要補充此前未提及的學習內容,給有意精進C語言者指明一條可供參考的學習路徑。
補充一:動態內存管理
-
核心函數(需
#include <stdlib.h>
):-
malloc(size)
:申請size
字節的連續內存,返回首地址(類型為void*
)。 -
calloc(n, size)
:申請n*size
字節內存,并初始化為0。 -
realloc(ptr, new_size)
:調整已分配內存塊大小。 -
free(ptr)
:釋放內存,防止內存泄漏。
-
-
示例:
int *arr = (int*)malloc(5 * sizeof(int)); // 動態數組 if (arr == NULL) exit(1); // 檢查分配成功 arr[0] = 10; free(arr); // 釋放內存
補充二:枚舉類型(enum)
-
定義與使用:
enum Weekday {Sun=7, Mon=1, Tue, Wed}; // Tue自動=2 enum Weekday day = Mon; // day值為1
-
用途:提高代碼可讀性,限定變量取值范圍。
-
補充三:類型定義(typedef)
-
作用:為現有類型創建別名。
typedef int Integer; // Integer 是 int 別名 typedef struct Node { // 簡化結構體聲明int data;struct Node *next; } Node; Node n; // 直接使用別名
補充四:位運算
-
運算符:
-
&
(按位與)、|
(按位或)、^
(按位異或) -
~
(按位取反)、<<
(左移)、>>
(右移)
-
-
應用場景:
-
硬件控制:
PORT |= 0x01;
(設置最低位為1) -
數據壓縮:用位存儲多個布爾值。
-
示例:
a = b << 2;
?→?b
左移2位(等價于b*4
)。
-
補充五:命令行參數
-
main函數參數:
int main(int argc, char *argv[]) {// argc: 參數個數(至少為1,程序名本身)// argv: 參數字符串數組printf("程序名: %s\n", argv[0]);if (argc > 1) printf("第一個參數: %s\n", argv[1]); }
-
執行:
./program arg1 arg2?→?argc=3,?argv[1]="arg1"。
-
補充六:const關鍵字
-
作用:
-
定義常量:
const int MAX=100;
(值不可修改) -
保護指針:
const int *p = &a; // *p只讀(指向的值不可改) int *const p = &a; // p只讀(指向不可改)
-
補充七:預處理器高級用法
-
條件編譯:
#ifdef DEBUG // 若定義了DEBUG宏printf("調試信息"); #endif
-
預定義宏:
-
__LINE__
:當前行號 -
__FILE__
:當前文件名 -
__DATE__
:編譯日期
-
補充八:聯合體(union)
-
特點:所有成員共享同一內存空間(大小為最大成員的大小)。
-
應用:節省內存,同一時間只存儲一個成員值。
union Data {int i;float f;char str[20]; }; union Data d; d.i = 10; // 此時d.f和d.str無意義
補充九:文件定位函數
-
核心函數:
-
fseek(fp, offset, whence)
:移動文件指針。-
whence
:SEEK_SET
(文件頭)、SEEK_CUR
(當前位置)、SEEK_END
(文件尾)。
-
-
ftell(fp)
:返回當前文件指針位置。 -
rewind(fp)
:重置指針到文件頭。
-
-
示例:
fseek(fp, 10, SEEK_SET); // 定位到文件頭后第10字節 long pos = ftell(fp); // 獲取當前位置
關鍵總結:
動態內存管理是C語言核心難點,需嚴格配對
malloc/free
。位運算在嵌入式開發中至關重要。
const和typedef提升代碼健壯性和可讀性。
聯合體在協議解析、類型轉換中高效實用。
文件定位實現隨機讀寫,突破順序訪問限制。