#include <stdio.h>
#include <string.h>
// 推薦:分離結構體標籤與指標別名
typedef struct emp {
char sex[8];
char name[15];
int age;
} *EmpPtr; // EmpPtr 為指向 struct emp 的指標型別
int main() {
EmpPtr p; // 正確:p 為 struct emp*
// EmpPtr *p; // 錯誤:這會變成 struct emp**
// 需先配置記憶體
p = malloc(sizeof(struct emp));
strcpy(p->sex, "male");
strcpy(p->name, "zhangfei");
p->age = 20;
printf("sex: %s\nname: %s\nage: %d\n", p->sex, p->name, p->age);
free(p);
return 0;
}
// 不推薦:易混淆
typedef struct emp { ... } Emp, *EmpPtr;
建議分開定義,語意更清晰。
EmpPtr p; // 正確:p 是指標 EmpPtr *p; // 錯誤:p 是指標的指標
EmpPtr p; strcpy(p->name, "test"); // 未定義行為:p 未初始化
必須先 malloc 或指向現有物件。
struct TagNameTagNamePtr 或 PTagNamestruct TagName objmalloc/free// 清晰的分層定義
struct Employee { ... };
typedef struct Employee *EmployeePtr;
struct Employee e1; // 靜態物件
EmployeePtr e2 = malloc(...); // 動態物件