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

指針數組 vs 數組指針:C語言字符串解析的效率之爭

     編輯:關於C語言

背景:GPS/SMS 解析的性能抉擇

在嵌入式開發中解析 GPS 的 GPRMC 語句或自定義 SMS 指令時,數據結構的選擇直接影響執行效率與內存佔用。本文通過實戰代碼對比 二維字符數組 與 指針數組 兩種方案的優劣。

方案一:二維數組 —— 直觀但浪費

TCHAR szGPSSentence[128];      // 原始語句緩衝區
TCHAR szGPSFields[16][16];     // 解析結果:16 個字段,每個最長 15 字符

int SplitSentenceToFields1(TCHAR *src, TCHAR szFields[16][16]) {
    int i = 0, j = 0;
    while (*src) {
        if (*src != _T(' ')) {
            szFields[i][j++] = *src;  // 逐字符拷貝
        } else {
            szFields[i++][j] = 0;     // 字段結束
            j = 0;
        }
        src++;
    }
    szFields[i++][j] = 0;
    return i;
}

缺點:需要額外分配 szGPSFields 緩衝區,解析過程涉及大量字符拷貝,內存佔用固定且可能浪費(預留最大長度 × 字段數)。

方案二:指針數組 —— 零拷貝、極致高效

TCHAR *pGPSFields[16];  // 僅存儲指針,指向原語句內部

int SplitSentenceToFields2(TCHAR *src, TCHAR *pFields[]) {
    int i = 0;
    if (*src) {
        pFields[i++] = src;  // 記錄字段起始地址
        while (*src) {
            if (*src++ == _T(' ')) {
                *(src - 1) = 0;      // 就地截斷,插入結束符
                pFields[i++] = src;  // 下一字段起始
            }
        }
    }
    return i;
}

優勢:直接在原緩衝區 szGPSSentence 上插入 '\0' 分隔字段,零數據拷貝,內存佔用極小(僅 16 個指針 ≈ 64 字節),解析速度極快。

圖示:內存佈局對比

指針數組 vs 二維數組內存佈局對比

圖中可見:指針數組僅存儲指向原字符串各字段的指針,而二維數組需完整複製所有字符。

核心概念辨析:指針數組 ≠ 數組指針

聲明含義佔用空間 (32位系統)
char *p2[16];指針數組:含 16 個 char* 的數組16 × 4 = 64 字節
char (*p1)[16];數組指針:指向「含 16 個 char 的數組」的指針4 字節

口訣:[] 優先級高於 *。讀聲明時從變量名出發,先結合 [] 再結合 *。

適用場景總結

  • 字段長度不均、存在長字段 → 指針數組完勝
  • 字段極短但數量極多 → 二維數組略優(指針開銷相對較大)
  • 嵌入式/實時系統、內存受限、高頻解析 → 首選指針數組
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved