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

C語言指針聲明完全指南:從基礎到函數指針、數組指針的讀法與實戰技巧

     編輯:關於C語言

指針基礎回顧

[cpp]
int i = 10;
int *p;           // 宣告指向 int 的指針
p = &i;           // 取址賦值
printf("%d\n", *p); // 解引用獲取值 10

核心概念:指針本身是一個變量,佔用固定大小內存(32位 4B,64位 8B),存儲另一塊內存的地址。*p 訪問該地址處的數據。


聲明讀法核心規則:「右左法則」(Clockwise/Spiral Rule)

  1. 從變量名出發。
  2. 先看右邊:遇到 [] 說明是數組,() 說明是函數。
  3. 再看左邊:遇到 * 說明是指針,const/類型說明指向類型。
  4. 重複直到讀完聲明。

經典聲明對比與實戰演示

1. 數組指針 vs 指針數組

[cpp]
char (*a)[100];   // ① 指向「含 100 個 char 的數組」的指針
char *a[100];     // ② 含 100 個「char*」的數組(指針數組)

讀法演示:

  • ① a → 右邊 [100] → 是數組?不,右邊是 ),再看左邊 * → 是指針 → 指向 char [100]。
  • ② a → 右邊 [100] → 是含 100 元素的數組 → 元素類型看左邊 char* → 指針數組。

2. 二維數組與指針算術差異

[cpp]
int arr[10][100];
int *p = &arr[0][0];       // 指向 int
int (*q)[100] = &arr[0];   // 指向 int[100]

printf("%zu\n", sizeof(*p)); // 4  (sizeof(int))
printf("%zu\n", sizeof(*q)); // 400 (sizeof(int[100]))

p++;  // 地址 +4
q++;  // 地址 +400 (跳過整整一行)

圖解:指針算術步長差異示意圖

3. 字符串二維數組正確聲明

[cpp]
char *str[2] = {"liushuai", "kobe"};  // 指針數組,每項指向字面量
printf("%s %s\n", str[0], str[1]);    // 輸出: liushuai kobe

函數指針完全解析

基本聲明

[cpp]
int *foo(int);           // 返回 int* 的函數
void (*bar)();           // 指向「無參無返回值函數」的指針

進階:返回函數指針的函數

[cpp]
// 返回「接受 double*, char 並返回 int 的函數指針」的函數
int (*foo(int)) (double*, char);

// 使用 typedef 簡化
typedef int (*FuncPtr)(double*, char);
FuncPtr foo(int);

實戰:signal() 原型拆解

[cpp]
// 原始聲明(極難讀)
void (*signal(int sig, void (*func)(int))) (int);

// typedef 逐層拆解
typedef void (*SigHandler)(int);  // 信號處理函數類型
SigHandler signal(int sig, SigHandler func);  // 清晰版本

函數指針調用示例

[cpp]
void printMyName() { printf("liushuaikobe\n"); }

int main() {
    void (*f)() = printMyName;  // 函數名隱式轉換為地址
    f();                        // 直接調用
    f = &printMyName;           // 顯式取址亦可
    f();
    return 0;
}

指針聲明快速查閱表

聲明含義
int *p;指向 int 的指針
int *p[10];10 個 int* 的數組
int (*p)[10];指向 10 個 int 數組的指針
int *func();返回 int* 的函數
int (*func)();指向返回 int 函數的指針
int *(*func[])();函數指針數組,每個函數返回 int*
int (*(*func)())[];指向函數的指針,該函數返回數組指針

避坑錦囊

  1. 優先用 typedef 分層拆解 複雜聲明,不要硬啃。
  2. const 位置決定修飾對象:const int *p(指向常量)vs int *const p(常量指針)。
  3. 函數參數中的數組自動退化為指針,sizeof 失效,需額外傳長度。
  4. 64位系統指針 8 字節,%p 打印地址,%zu 打印 sizeof 結果。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved