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

C語言指針進階:數組指針、指針數組、函數指針、指針函數完全區分指南

     編輯:關於C語言

C語言指針進階:數組指針、指針數組、函數指針、指針函數完全區分指南

「數組指針、指針數組、函數指針、指針函數」是C語言指針進階學習中的「四大金剛」,也是面試高頻考點。本文通過核心定義、聲明語法、優先級規則、右左法則四個維度,徹底消除概念混淆,建立精確的類型識別能力。

一鍵區分口訣:「只看最後兩個字」

  • 數組指針 → 本質是 指針(指向數組的指針)
  • 指針數組 → 本質是 數組(元素是指針的數組)
  • 函數指針 → 本質是 指針(指向函數的指針)
  • 指針函數 → 本質是 函數(返回指針的函數)

一維數組的四種訪問方式(基礎回顧)

int a[5] = {1,2,3,4,5};
int *p = a;  // p 指向首元素

// 1. 下標法:a[i] / p[i]
// 2. 數組名+偏移:*(a+i)
// 3. 指針+偏移:*(p+i)
// 4. 指針下標:p[i]  (編譯器自動轉為 *(p+i))
// 結論:數組名在表達式中退化為指向首元素的指針

四大類型聲明與解析

1. 數組指針 — 指向整個數組的指針

int a[3] = {2,3,4};
int *p1 = a;        // 指向首元素 int*
int (*p2)[3] = &a;  // 數組指針:指向 int[3] 類型

// 聲明解析:int (*p)[n]
// () 優先級高 → p 是指針 → 指向 int[n] 類型
// 用途:二維數組行指針、函數參數傳遞整個數組

2. 指針數組 — 存儲多個指針的數組

int a=10, b=20, c=30;
int *pa[3] = {&a, &b, &c};  // 指針數組:int* [3]

// 聲明解析:int *p[n]
// [] 優先級高 → p 是數組 → 元素類型 int*
// 用途:字符串數組、main參數 argv、命令表跳轉

3. 函數指針 — 指向函數的指針

int Max(int a, int b) { return a>b?a:b; }

int (*pfun)(int, int);  // 函數指針聲明
pfun = Max;             // 函數名即地址,&可省略
pfun = &Max;            // 等效
int res = (*pfun)(3,5); // 調用,*可省略
int res = pfun(3,5);    // 等效

// 聲明三要素:返回類型、參數類型、參數個數 必須匹配
// 語法:返回類型 (*指針名)(參數列表)

4. 指針函數 — 返回指針的函數

int* GetPtr(int idx) {
    static int arr[10];
    return &arr[idx];  // 返回地址
}

// 聲明:int *fun();  等同 int* fun();
// 本質:函數,返回類型為指針
// 用途:工廠函數、鏈表節點創建、動態內存分配封裝

優先級規則速查表

聲明結合順序本質關鍵標記
int (*p)[n]p → *p → (*p)[n]指針括號綁定 *
int *p[n]p → p[n] → *p[n]數組[] 綁定 p
int (*p)(int)p → *p → (*p)(int)指針括號綁定 *
int *p()p → p() → *p()函數() 綁定 p

右左法則——通用複雜聲明解析神器

步驟:

  1. 找到標識符(變量名)
  2. 先看右邊,再看左邊
  3. 遇到 () 或 [] 時改變方向
  4. 解析完一層括號後跳出,繼續循環

實戰演練

// 例1:int (*fun)(int *p)
fun → 右邊 (int *p) → 函數,參數 int* → 左邊 * → 指針 → 左邊 int → 返回 int
結論:函數指針,指向 參數int* 返回int 的函數

// 例2:int (*fun[5])(int *p)
fun → 右邊 [5] → 數組(5個元素) → 左邊 * → 元素是指針 → 跳出 → 右邊 (int *p) → 函數
結論:函數指針數組,5個元素,每個指向 參數int* 返回int 的函數

綜合對比總結表

類型聲明示例sizeof(類型)典型應用
數組指針int (*p)[10]指針大小(4/8字節)二維數組形參、矩陣運算
指針數組int *p[10]10×指針大小字符串數組、argv、虛函數表
函數指針int (*p)(int,int)指針大小回調、狀態機、策略模式
指針函數int* p(int)函數代碼大小工廠、分配器、鏈表創建

總結

掌握「只看最後兩字識本質、優先級規則辨聲明、右左法則解複雜」三大核心技能,即可輕松應對所有指針類型聲明與識別問題。建議收藏本文對照表,實戰中多寫、多畫內存圖,將語法規則內化為類型直覺。

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