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

C 語言核心知識點總結:從基礎語法到指標與記憶體管理

     編輯:關於C語言

C 語言核心知識點總結:從基礎語法到指標與記憶體管理

本文整理自經典入門書《Head First C》,涵蓋 C 語言從編譯執行、基本語法、控制流程、函式特性、字串處理、指標運算、結構與聯合、動態記憶體分配、進階函式應用到系統呼叫等核心概念,適合初學者建立完整知識框架,也可供進階開發者快速回顧。

一、開發環境與基礎語法

1. 編譯與執行

使用 GCC 編譯單一原始檔:

gcc name.c -o name

執行產生的執行檔:

./name

或串聯指令一次完成編譯與執行:

gcc name.c -o name && ./name

2. 關鍵字與 sizeof 運算子

sizeof 是編譯期運算子,回傳型別或變數佔用的位元組數:

  • sizeof(int) → 4
  • sizeof("Turtles!") → 9(含 8 字元與結束字元 \0)

3. 基本輸入輸出

puts() 輸出字串並自動換行,用法類似 printf() 但無格式化功能。

scanf() 讀取格式化輸入,務必限制寬度 以防緩衝區溢位:

char ex[20];
puts("輸入男友的名字:");
scanf("%19s", ex);  // 最多讀 19 字元,留空間給 \0
printf("親愛的%s,我們分手吧。\n", ex);

4. 變數型別

  • char:字元(1 位元組)
  • int:整數(通常 4 位元組)

5. C 程式基本架構

#include <stdio.h>

int main() {
    int decks;
    puts("輸入有幾副牌");
    scanf("%i", &decks);
    if (decks < 1) {
        puts("無效的副數");
        return 1;  // 非零返回值表示錯誤
    }
    printf("一共有%i張牌\n", decks * 52);
    return 0;  // 0 代表成功
}

二、函式與控制流程深度解析

1. main() 回傳值的意義

main() 必須回傳 int。作業系統透過此值判斷程式是否正常結束:0 表成功,非零表失敗。

2. 運算式皆有回傳值

C 語言中幾乎所有運算式皆有值,包含賦值運算式:

x = 4;      // 運算式值為 4
y = x = 4;  // 串聯賦值,x 與 y 皆設為 4

3. 字串處理:陣列與字面常數

  • C 無 string 型別,改用 char 陣列,結尾以 \0 標記。
  • 字面常數(如 "hello")存放於唯讀區,嘗試修改會導致總線錯誤。
  • 若需可修改字串,應宣告陣列:char str[] = "hello";

4. 格式化輸出 printf()

printf("%s 說計數是 %i", "阿星", 21);

每個 % 格式指示字必須對應一個引數。

5. atoi():字串轉整數

標準庫函式,將數字字串轉為 int。

6. Linux/Mac 執行檔路徑 ./ 的由來

類 Unix 系統預設不搜尋當前目錄,除非目錄在 PATH 環境變數中,故需以 ./ 指定路徑。

7. 索引從 0 開始的原因

索引代表「相對於陣列起始位置的位移量」,首元素位移為 0。

8. 單雙引號差異

  • 單引號 'a':單一字元常數(int 型別)
  • 雙引號 "a":字串字面常數(char*,含 \0)

9. 賦值與比較運算子

  • =:賦值
  • ==:相等比較
  • +=、-=:複合賦值
  • ++、--:遞增/遞減

10. 布林邏輯與短路求值

  • &&(邏輯 AND):左側為假則不評估右側
  • ||(邏輯 OR):左側為真則不評估右側
  • !:邏輯非
  • C89 以 0 表假,非 0 表真;C99 引入 _Bool、true、false(實為 1/0)

11. 位元運算子 &、| vs &&、||

  • &、|:位元 AND/OR,總是評估兩側
  • &&、||:邏輯運算,具備短路特性

位元運算常用於旗標操作:6 & 4 = 4(二進位 110 & 100 = 100)。

12. switch 限制

  • 僅能比較整數或字元常數值
  • 無法直接比較字串或陣列

13. 迴圈結構與 for 語法糖

所有迴圈具備三要素:初始化、條件判斷、更新。for 將三者集中:

for (int i = 1; i < 11; i++) {
    printf("%i 個棗\n", i);
}

14. break 與 continue

  • break:跳出最內層迴圈或 switch,無法跳出 if
  • continue:跳過本次迴圈剩餘部分,直接進入下一次判斷

經典教訓:1990 年 AT&T 長途系統癱瘓,緣於開發者誤用 break 試圖跳出 if,導致診斷碼被略過。

15. void 函式仍可用 return

可提前離開函式,編譯器可能發出警告。

三、指標與記憶體模型

1. 指標本質

指標儲存記憶體位址,用途:

  • 避免複製大型資料
  • 實現多函式共享資料

2. 記憶體區段

  • 區域變數 → 堆疊
  • 全域/靜態變數 → 全域區
  • 動態分配 → 堆積

3. 參數傳遞機制:傳值呼叫

函式接收的是引數的副本,若需修改原變數,必須傳遞位址:

void go_south_east(int *lat, int *lon) {
    *lat -= 1;  // 解參考修改原值
    *lon += 1;
}

4. 指標運算與型別

指標加 1 會依其基底型別大小移動位址:char* +1 位移 1 位元組,int* +1 位移 4 位元組。

5. 陣列名即首元素位址

char quote[] = "Cookie make you fat";
// quote 相當於 &quote[0]

6. scanf() 緩衝區溢位風險與 fgets() 替代

char food[5];
fgets(food, sizeof(food), stdin);  // 安全讀取,含換行符

fgets 會保留換行符,且尺寸參數已含 \0 空間,無需像 scanf("%4s") 那樣手動減 1。

7. const 與字串字面常數

const char *s = "read only";  // 編譯期防護:嘗試修改會報錯

四、字串函式庫 string.h

函式功能
strlen回傳字串長度(不含 \0)
strcpy複製字串
strcat串接字串
strcmp比較字串
strchr尋找字元
strstr尋找子字串

Linux/Mac 可用 man strstr 查閱手冊。

五、結構、聯合、列舉與位欄

1. 結構 struct

struct fish {
    const char *name;
    const char *species;
    int teeth;
    int age;
};
  • 成員存取:snappy.teeth 或 ptr->teeth
  • typedef 簡化宣告:typedef struct { ... } fish_t;
  • 匿名結構搭配 typedef 直接產生型別別名

2. 聯合 union

所有成員共用同一記憶體空間,同一時間僅有一個成員有效:

typedef union {
    short count;
    float weight;
    float volume;
} quantity;

需自行設計機制(如列舉)記錄目前儲存的型別。

3. 列舉 enum

定義一組具名常數:

enum colors { RED, GREEN, BLUE };
enum colors favorite = GREEN;

4. 位欄

精確控制位元佈局,適用於硬體暫存器對應:

typedef struct {
    unsigned int low_pass_vcf : 1;
    unsigned int reverb : 1;
} synth;

六、資料結構與動態記憶體

1. 鏈結串列

彈性儲存可變數量資料,節點包含資料與指向下一節點的指標(遞迴結構)。

2. 動態記憶體管理

  • malloc(sizeof(Type)):分配記憶體,回傳 void*
  • free(ptr):釋放記憶體
  • strdup():複製字串並自動分配空間

3. exit() 立即終止程式

不執行清理動作,直接回傳狀態碼給作業系統。

七、進階函式應用

  • void*:泛型指標,可指向任意型別
  • 函式指標:實現回呼、策略模式
  • 巨集 #define:編譯期文字替換,可模擬可變參數函式

八、行程與系統呼叫

  • system():啟動 Shell 執行指令,有安全風險(指令注入)
  • exec() 系列:以新程式映像取代目前行程,PID 不變,避免 Shell 解析風險

掌握上述知識點,即能應對絕大多數 C 語言開發場景。建議配合實作練習,深入體會指標運算、記憶體佈局與系統介面的運作機制。

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