在嵌入式開發中解析 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 字節),解析速度極快。

圖中可見:指針數組僅存儲指向原字符串各字段的指針,而二維數組需完整複製所有字符。
| 聲明 | 含義 | 佔用空間 (32位系統) |
|---|---|---|
char *p2[16]; | 指針數組:含 16 個 char* 的數組 | 16 × 4 = 64 字節 |
char (*p1)[16]; | 數組指針:指向「含 16 個 char 的數組」的指針 | 4 字節 |
口訣:[] 優先級高於 *。讀聲明時從變量名出發,先結合 [] 再結合 *。