C 語言數組要求 元素類型統一,無法直接在同一個 int[] 或 char[] 中同時存放「字符」與「整數值」。但可通過以下三種工程化方案實現混存需求。
利用 char 本質是 1 字節整數,可存 0-255 的值:
char buffer[100];
// 存數字 65 -> 'A' (ASCII 65)
// 存符號 '+' -> 43
buffer[0] = 65; // 實際存 'A'
buffer[1] = '+'; // 實際存 43
// 讀取時需知道位置含義
if (is_alpha_pos(0)) printf("字符: %c\n", buffer[0]);
else printf("數值: %d\n", buffer[0]);
⚠️ 缺點:需自行維護「哪個位置存字符、哪個存數值」的映射規則,易出錯。
每個元素攜帶類型標識,運行時動態判斷:
typedef enum { TYPE_CHAR, TYPE_INT } DataType;
typedef struct {
DataType type;
union {
char ch;
int num;
} value;
} MixedItem;
MixedItem arr[10];
arr[0] = (MixedItem){TYPE_CHAR, .value.ch = 'A'};
arr[1] = (MixedItem){TYPE_INT, .value.num = 65};
void print_item(MixedItem *p) {
if (p->type == TYPE_CHAR) printf("字符: %c\n", p->value.ch);
else printf("整數: %d\n", p->value.num);
}
✅ 優點:類型安全、擴展性強(可加 float/double)、代碼可讀性高。
分離存儲,索引對應:
char symbols[100];
int numbers[100];
int sym_cnt = 0, num_cnt = 0;
// 存入
symbols[sym_cnt++] = '+';
numbers[num_cnt++] = 42;
// 遍歷處理
for (int i = 0; i < sym_cnt; i++) handle_symbol(symbols[i]);
for (int i = 0; i < num_cnt; i++) handle_number(numbers[i]);
✅ 優點:簡單、無類型轉換、緊湊內存、適合「批量同類處理」場景。
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 簡單協議解析(如表達式求值) | 方案二(結構體+聯合體) | 需區分操作數/運算符,類型安全關鍵 |
| 純數據收集,後期分類處理 | 方案三(平行數組) | 內存局部性好,遍歷快,代碼最簡潔 |
| 極度受限內存(嵌入式 < 2KB RAM) | 方案一 + 位圖標記 | 節省結構體開銷,需嚴格文檔化位置約定 |
編譯期根據類型自動選擇處理函數,配合方案二可實現類似多態:
#define PRINT(x) _Generic((x), \
char: print_char, \
int: print_int \
)(x)
void print_char(char c) { printf("char: %c\n", c); }
void print_int(int n) { printf("int: %d\n", n); }
// 使用
PRINT('A'); // 展開為 print_char('A')
PRINT(65); // 展開為 print_int(65)
C 語言無原生「混合類型數組」,但通過 聯合體+類型標記(方案二)可獲得最佳工程質量;平行數組(方案三)適合高性能批量處理;char 統一存儲(方案一)僅限極簡場景。選型原則:優先類型安全,次求性能,最後才是節省鍵盤敲擊。