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

C語言指針進階(七):複雜聲明讀法、指針運算總結與章節綜合練習

     編輯:C 語言基礎

複雜聲明讀法:從裡向外,優先級規則

C 聲明由標識符出發,按運算符優先級解析:

  1. 標識符右側:[] (數組) 和 () (函數) 同級,左結合。
  2. 標識符左側:* (指針) 優先級較低。
  3. 括號 () 可改變結合順序。

閱讀步驟「從裡向外」


int *(*(*a)())[10]
↑  ↑ ↑  ↑ ↑ ↑
7  6 4  2 1 3 5  (閱讀順序)
  1. a 是標識符。
  2. 右側無 []/(),看左側 *:指針變量。
  3. 遇到括號 (*a),進入括號內:a 是指針。
  4. 括號外 ():指向函數。
  5. 函數返回 *:返回指針。
  6. 該指針指向 [10]:含 10 元素的數組。
  7. 數組元素類型 int*:指向 int 的指針。

結論:a 是函數指針,指向函數,該函數返回指針,指向含 10 個 int* 的數組。

常見組合聲明對照表

聲明含義
int *p;指向 int 的指針
int *p[10];指針數組,10 個指向 int 的指針
int (*p)[10];指向含 10 個 int 的數組的指針(二維數組行指針)
int *p();返回指向 int 指針的函數
int (*p)();指向返回 int 函數的指針
int **p;指向指向 int 指針的指針(二級指針)

指針運算總結

運算合法對象含義非法示例
& 取址變量、數組元素、函數獲取地址&10, &a+b
* 解引用指針訪問所指對象對非指針解引用
賦值同類型指針間拷貝地址int* = char* (需轉型)
+n/-n指向數組/字符串的指針移動 n 個元素指向單變量的指針 +1
++/--同上移動 1 元素同上
- (指針減指針)指向同一數組的兩指針元素個數差不同數組指針相減
== != < > <= >=同一數組指針、或與 NULL/0位置比較無關指針比較

非法組合:語法允許但語義錯誤

  • int a[5](); — 數組元素不能是函數。
  • int f()(); — 函數不能返回函數(可返回函數指針)。
  • int f()[5]; — 函數不能返回數組(可返回指向數組的指針)。

綜合練習:聲明解析

  1. char *const *(*next)();
    • next 是函數指針 → 函數返回 char *const *(指向常量字符指針的指針)。
  2. void (*signal(int, void(*)(int)))(int);
    • 經典 signal 聲明:參數 1 int,參數 2 函數指針 void(*)(int),返回函數指針 void(*)(int)。
  3. int (*(*x[3])())[5];
    • x 是數組[3] → 元素是函數指針 (*x[3])() → 函數返回 (*)[5] → 指向含 5 個 int 的數組的指針。

本章核心知識圖譜


指針
├── 基礎:&、*、賦值、NULL
├── 數組指針:int *p = a; p+i, *(p+i)
├── 字符串指針:char *s = "lit"; const 保護
├── 二維數組指針:int (*p)[N]; 行偏移自動
├── 函數指針:int (*fp)(int,int); 回調核心
├── 指針函數:int *f(); 返回指針,防懸空
├── 指針數組:int *pa[N]; 字符串表、異構表
├── 二級指針:int **pp; 修改一級指針、argv
└── 複雜聲明:從裡向外,[]()優先於*

工程避坑清單

  • ☐ 所有指針使用前初始化(NULL 或合法地址)。
  • ☐ malloc 後檢查 NULL,用完 free,置 NULL 防野指針。
  • ☐ 字符串字面量只讀,const char* 接收。
  • ☐ 數組作參數退化為指針,長度信息丟失,需額外傳長度。
  • ☐ 二維數組傳參用 int (*p)[N] 或 int *p[],勿用 int**。
  • ☐ 函數指針聲明括號 (*fp) 不可省。
  • ☐ 複雜聲明用 typedef 分層簡化:typedef int (*FP)(int); FP fp;。
  • ☐ 指針算術單位是所指類型大小,非字節。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved