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

《深入理解 C 指針》閱讀筆記:第一章核心知識點與代碼實踐

     編輯:關於C語言

《深入理解 C 指針》閱讀筆記:第一章核心知識點與代碼實踐

本書雖薄,卻直擊指針核心難點,適合初學者建立正確心智模型。第一章重點涵蓋 size_t 正確使用、指針算術運算本質、const 與指針的四種組合語義。以下整理關鍵結論並附可編譯驗證代碼。

1. size_t:無符號尺寸類型的正確打開方式

size_t 是 sizeof 運算符的返回類型,保證能容納最大對象字節數。打印時必須用 %zu (C99) 或 %lu + 強轉,否則有符號解讀會導致誤判。

void size_t_test() {
    size_t t1 = (size_t)-1;  // 最大值 0xFFFFFFFF / 0xFFFFFFFFFFFFFFFF
    size_t t2 = 1;
    printf("t1: %zu  t2: %zu\n", t1, t2);  // 正確輸出
    // 錯誤示範:printf("%d", t1) → 輸出 -1
}

2. 指針算術:步長 = sizeof(指向類型)

p + n 等價於 (char*)p + n * sizeof(*p)。指針類型決定步長,而非指針本身大小。

void pointer_add_sub_test() {
    int  i = 1;  int  *pi = &i;  // sizeof(int) = 4
    char c = 'a'; char *pc = &c;  // sizeof(char) = 1
    printf("pi: %p  pi+1: %p  diff=%td\n", (void*)pi, (void*)(pi+1), (pi+1)-pi); // diff=1
    printf("pc: %p  pc+1: %p  diff=%td\n", (void*)pc, (void*)(pc+1), (pc+1)-pc); // diff=1
    // 但地址增量:pi+1 比 pi 大 4 字節;pc+1 比 pc 大 1 字節
}

3. const 與指針的四種組合(核心考點)

聲明口訣可修改指針值可修改指向內容典型用途
const int *p
int const *p
const 修飾 *p → 指向常量的指針✅❌函數參數 const char *str 保護只讀
int * const pconst 修飾 p → 常量指針(指針本身不可變)❌✅固定緩衝區基址
const int * const p雙重 const❌❌只讀查表、字符串常量

代碼驗證

void const_to_pointer() {
    int v1 = 1, v2 = 2;
    const int cv = 3;

    // 1. 指向常量的指針
    const int *p1 = &v1;  // OK
    p1 = &v2;             // OK:改指向
    // *p1 = 10;          // 編譯錯誤:不可通過 p1 修改值
    v1 = 10;              // OK:通過原變量修改

    // 2. 常量指針(指針本身不可變)
    int * const p2 = &v1; // 必須初始化
    *p2 = 20;             // OK:修改值
    // p2 = &v2;          // 編譯錯誤:不可改指向

    // 3. 指向常量的常量指針
    const int * const p3 = &cv; // 雙重保護
}

章節小結

  • size_t 專為無符號尺寸設計,打印用 %zu。
  • 指針加減以「指向類型大小」為步長,這是類型系統賦予的語義。
  • const 位置決定語義:靠近類型修飾「被指內容」;靠近變量名修飾「指針本身」。

這三點是指針編程的基石,建立清晰心智模型後,後續多級指針、函數指針、指針數組等進階主題將不再迷茫。

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