首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言核心筆記:從基礎語法到指標進階

     編輯:關於C

第一章 C 語言特點與用途

  • 關鍵字 32 個,控制語句 9 種,運算符 34 種,語法簡潔靈活。
  • 資料結構豐富:整數、實數、字元、陣列、指標、結構、聯集。
  • 結構化控制:if-else, switch, while, do-while, for。
  • 可直接操作位元、記憶體位址、硬體埠,生成碼效率極高 (接近組語 80-90%)。
  • 可移植性佳,廣泛用於作業系統、嵌入式、編譯器、資料庫核心開發。

第二章 資料型別、運算子與表示式

基本型別

類別關鍵字典型大小備註
整數int short long long long2/4/8 位元組unsigned 修飾無號
實數float double long double4/8/16 位元組IEEE 754
字元char1 位元組可當小整數用
列舉enum-命名常數群
空型別void-無回傳/泛型指標

常數表示

  • 八進位:0123;十六進位:0x1F;字元:'a'、'\n'、'\x1B'。
  • 字串常數:"abc" 結尾隱含 \0,存於唯讀區;'a' 為單字元整數。

型別轉換規則 (隱式提升)

char, short → int → unsigned → long → long long
                                      → float → double → long double

常用運算子優先序 (高→低)

  1. () [] -> . (後置/結構成員)
  2. ++ -- + - ! ~ (type) * & sizeof (一元)
  3. * / %
  4. + -
  5. << >>
  6. < <= > >=
  7. == !=
  8. & (位元 AND)
  9. ^ (位元 XOR)
  10. | (位元 OR)
  11. && (邏輯 AND)
  12. || (邏輯 OR)
  13. ?: (條件)
  14. = += -= *= /= %= &= ^= |= <<= >>= (指派)
  15. , (逗號)

第三章 簡單程式設計 (控制結構)

三大基本結構

  • 循序
  • 選擇:if-else, switch-case, ?:
  • 迴圈:while, do-while, for

跳轉控制

  • break:跳出最內層 switch/迴圈。
  • continue:結束本次迴圈迭代,進入下一次判斷。
  • goto:非結構化跳轉,慎用。
  • return:離開函式並回傳值。

第四章 輸入輸出 (stdio.h)

printf 格式字元

字元說明常用旗標
%d %ld %lld有號十進位%05d 零填寬、%-5d 左靠
%u %lu無號十進位
%o %x %X八/十六進位%#x 加 0x
%c單一字元
%s字串%.10s 限寬、%-10s 左靠
%f %lf定點實數%8.3f 共 8 寬、3 位小數
%e %E %g %G科學/自動記號
%p指標位址

scanf 注意事項

  • 需傳變數位址 &var (陣列名/字串名本身即位址)。
  • 格式字串中空白字元匹配任意空白;%*d 跳過讀取。
  • 不支援精度指定 (如 %5.2f 非法)。

第五章 陣列與字串

靜態/動態宣告

int a[10] = {0};           // 靜態,未初始化為 0
int *p = malloc(n*sizeof(int)); // 動態,需 free

多維陣列記憶體佈局

Row-major:a[i][j] 位址 = base + (i*COLS + j)*sizeof(int)。
函式參數:void f(int a[][COLS]) 或 void f(int (*a)[COLS]),第二維必須給定。

常用字串函式 (string.h)

  • strlen、strcpy、strncpy、strcat、strncat
  • strcmp、strncmp、strchr、strstr
  • strtok (破壞原字串、非執行緒安全,建議用 strtok_r)

警告: strcat(dest, src) 需確保 dest 空間足夠,否則緩衝區溢位。

第六章 函式

參數傳遞:呼叫傳值

形式參數為區域變數,實參值複製給形參。若需修改實參,傳遞指標:void swap(int *a, int *b)。

遞迴

函式直接/間接呼叫自身。需有基礎案例終止。例:階乘、費波那契、河內塔。

儲存類別與連結屬性

關鍵字儲存期作用域連結性預設值
auto (省略)區塊區塊無不定
register區塊區塊無不定
static (區塊內)程式區塊無0
extern程式檔案/全域外部0
static (檔案層級)程式檔案內部0

函式預設為 extern;static 函式僅本檔可見。

第七章 前置處理器

巨集定義

#define PI 3.14159
#define SQR(x) ((x)*(x))          // 括號防優先序錯誤
#define MAX(a,b) ((a)>(b)?(a):(b))
#define DEBUG_PRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)

檔案包含

  • #include <sys.h>:系統標準路徑搜尋。
  • #include "my.h":先當前目錄,再標準路徑。

條件編譯

#ifdef DEBUG
    #define LOG(...) DEBUG_PRINT(__VA_ARGS__)
#else
    #define LOG(...)
#endif

#ifndef GUARD_H
#define GUARD_H
// 頭檔內容
#endif

第八章 指標進階

指標宣告與基本操作

int *p;       // 指向 int 的指標
int **pp;     // 指向指標的指標
int (*pa)[10]; // 指向 10 元素 int 陣列的指標
int *pa[10];  // 10 個指向 int 的指標陣列 (陣列指標)

指標運算

  • p + n:位址增加 n * sizeof(*p)。
  • p - q:同陣列兩指標相減得元素個數差 (ptrdiff_t)。
  • *p、p[i] 等價 *(p+i)。

指標與陣列/字串/函式

  • 陣列名在大多數表達式中退化為首元素指標 (int *),但 sizeof(arr) 為整個陣列大小,&arr 型別為 int (*)[N]。
  • 字串字面常數型別 const char *,存唯讀區,不可修改。
  • 函式指標:int (*cmp)(const void*, const void*),用於 qsort、回呼機制。

動態記憶體管理 (stdlib.h)

void *malloc(size_t size);           // 未初始化
void *calloc(size_t n, size_t size); // 零初始化
void *realloc(void *ptr, size_t size); // 調整大小
void free(void *ptr);                // 釋放,ptr 需為 malloc 系回傳或 NULL

鐵律: 每個 malloc/calloc/realloc 必配對 free,釋放後指標置 NULL 避免野指標。

第九章 結構、聯集、位元欄

struct Node {
    int data;
    struct Node *next;
};
union Data { int i; float f; char c; }; // 共用記憶體,大小取最大成員

struct Flags { unsigned int a:1; unsigned int b:3; unsigned int :0; }; // 位元欄,:0 強制對齊

第十章 輸入輸出進階 (檔案操作)

FILE *fp = fopen("data.bin", "wb"); // 二進位寫入
fwrite(buf, sizeof(Record), count, fp);
fclose(fp);

fp = fopen("data.bin", "rb");
fseek(fp, offset, SEEK_SET);
fread(&rec, sizeof(Record), 1, fp);

錯誤處理:檢查回傳值,ferror(fp), feof(fp), perror()。

總結

本筆記涵蓋 C 語言核心知識體系,建議配合《C Primer Plus》、《C 程式設計語言 (K&R)》、《C 專家程式設計》深入研讀,並大量實作專案 (如解譯器、資料庫、網路伺服器、嵌入式韌體) 內化為技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved