一、概念
給數據類型定義一個新的名字
二、使用
1、基本數據類型
#include <stdio.h> typedef int Integer; // 給int起一個新的名字Integer後,int能正常使用 typedef Integer Integer2; // 在別名的基礎上,再給Integer起一個新的名字Integer2 int main() { int i = 1; Integer i2 = 2; Integer2 i3 = 3; printf("%d, %d, %d\n", i, i2, i3); // 輸出:1, 2, 3 return 0; }
2、指針
#include <stdio.h> typedef char * String; // 給char *起一個新的名字String int main() { String name = "hello"; printf("%s\n", name); // 輸出:hello return 0; }
3、結構體
// 方式一 struct PersonType { char *name; }; typedef struct PersonType Person; // 方式二 typedef struct StudentType { char *name; } Student; // 方式三 typedef struct{ char *name; } Cat; int main() { // 方式一 Person p = {"hello"}; printf("%s\n", p.name); // 輸出:hello // 方式二 Student stu = {"world"}; printf("%s\n", stu.name); // 輸出:world // 方式三 Cat cat = {"world"}; printf("%s\n", cat.name); // 輸出:world return 0; }
4、指向結構體的指針
#include <stdio.h> struct Person { char *name; }; typedef struct Person * PersonPoint; int main() { struct Person p = {"hello"}; PersonPoint pp = &p; pp->name = "world"; printf("%s\n", p.name); return 0; }
5、枚舉
#include <stdio.h> /* // 方式一 enum SexEnum { Man, Woman, Unknow }; typedef enum SexEnum Sex; // 方式二 typedef enum SexEnum { Man, Woman, Unknow } Sex; */ // 方式三 typedef enum { Man, Woman, Unknow } Sex; int main() { Sex sex = Man; printf("%d\n", sex); return 0; }
6、指向函數的指針
#include <stdio.h> int sum(int v1, int v2) { return v1 + v2; } typedef int (*IntFunc)(int, int); int main() { IntFunc func = sum; printf("%d\n", func(3, 4)); return 0; }
三、#define與typedef
先看下面的代碼輸出:#define String char * typedef char * String2; int main() { String s1 = "hello"; String2 s2 = "world"; printf("%s, %s\n", s1, s2); return 0; }
hello, world
這段代碼大家都很容易理解,現在再看下面的代碼此時有什麼區別呢?讓我們來分析一下:#include <stdio.h> #define String char * typedef char * String2; int main() { String s1, s2; String2 s3, s4; return 0; }
String s1, s2; 因爲String 是一個宏定義,編譯預處理的時候會直接替換掉,也就相當於char *s1, s2;再明白點就是char *s1; char s2; 這個可以通過sizeof得到證明,只有s1 是char *類型,s2是char 類型。
String2 s3, s4; typedef 是給類型起一個別名,所以就等於 char *s3; char *s4; 所以s3, s4都是char *類型的。