typedef 是C語言賦予開發者的「型別別名」機制,配合結構體指標使用,能大幅簡化複雜聲明、統一介面風格。本文通過實例演示 typedef 定義結構體指標型別的正確姿勢、常見誤區與最佳實踐。
#include <stdio.h>
#include <string.h>
// 正確:直接將結構體指標型別命名為 emp
typedef struct emp {
char sex[8];
char name[15];
int age;
} *emp; // emp 現在是「指向 struct emp 的指標」型別
int main() {
emp p; // 相當於 struct emp *p;
// emp *p; // 錯誤!這會變成 struct emp **p
strcpy(p->sex, "male");
strcpy(p->name, "zhangfei");
p->age = 20;
printf("sex is %s\n", p->sex);
printf("name is %s\n", p->name);
printf("Age is %d\n", p->age);
return 0;
}
關鍵點:typedef struct {...} *emp; 使 emp 直接成為指標型別,宣告變數時 不再需要加 *。
// 不推薦:同時定義結構體標籤 pi 和指標別名 emp
typedef struct emp {
char sex[8];
char name[15];
int age;
} pi, *emp; // pi 是結構體型別,emp 是指標型別
缺點:同一個 typedef 引入兩種風格的型別名(pi 需加 struct 或單獨用,emp 已含指標),團隊協作時極易混淆,維護成本高。
*」,要么全部用「typedef 定義指標型別」。禁止混用。_ptr 或 _t 後綴(如 emp_t, NodePtr),一眼識別為指標。typedef struct Emp *EmpHandle;,實現資訊隱藏,降低耦合。typedef struct Node **NodePtrPtr; 讓代碼難以閱讀,必要時逐層定義並加註釋。結構體指標常作為回調函數參數,typedef 簡化函數指標聲明:
// 定義:接受 emp 指標,返回 int 的函數指標型別
typedef int (*EmpCallback)(emp worker);
int promote(emp worker) { /* ... */ return 0; }
void process(EmpCallback cb, emp e) {
cb(e);
}
int main() {
process(promote, p); // 乾淨利落
}
typedef struct {...} *TypeName; 是C語言中簡化結構體指標聲明的標準慣用法。正確使用能讓代碼更像高階語言(物件句柄風格),降低認知負荷。但請記住:typedef 不創造新型別,只是別名;指標的本質(地址、間接引用、所有權)不變。團隊中統一風格、明確命名、配合不透明指標封裝,才能發揮最大價值。