一、typedef作用简介
我们可以使用typedef关键字为各种数据类型定义一个新的名字(别名)。
#include <stdio.h> typedef int Integer; typedef char* String; int main() { Integer age = 100; String name = "Jackit"; printf("%d\n%s\n",age,name); return 0; }
在上面的代码中我给int和char *分别定义了别名Integer和String,然后用他们声明了一个整数和字符串。
二、typedef和结构体
给结构体起别名可以省略在声明变量的时候必须要添加的struct,但是使用typedef就不一定了
#include <stdio.h> typedef struct struct_person { int age; char * name; float height; }Person; struct struct_animal { int age; char * name; float height; }; typedef struct struct_animal Animal; int main() { Person person; person.age = 19; person.name = "Jackit"; person.height = 119.22; printf("%d\n%s\n%.1f\n",person.age,person.name,person.height); Animal animal; animal.age = 3; animal.name = "Monkey"; animal.height = 19.22; printf("%d\n%s\n%.1f\n", animal.age, animal.name, animal.height); return 0; }
以上说明了两种使用typedef给结构体起别名的方式,然后其实使用宏定义也可以达到这种效果。
#include <stdio.h> struct struct_animal { int age; char * name; float height; }; #define Animal struct struct_animal int main() { Animal animal; animal.age = 3; animal.name = "Monkey"; animal.height = 19.22; printf("%d\n%s\n%.1f\n", animal.age, animal.name, animal.height); return 0; }
它只是在定义的时候和使用typedef的声明顺序反过来了,这里需要注意一下。
宏定义只是简单的对文本进行替换,我们在给数据类型起别名的时候还是尽量使用typedef,不要使用宏定义。
三、typedef和枚举类型
#include <stdio.h> enum enum_season { Spring, Summer, Autumn, Winter }; typedef enum enum_season Season; int main() { Season season = Spring; enum enum_season sn2 = Winter; return 0; }
上面的代码可以看出,枚举类型使用别名一个非常重要的好处就是可以省去关键字enum,然后原来声明枚举的方式还是可以使用的。
四、typedef和函数指针
首先来看一下正常的函数指针的用法
#include <stdio.h> int sum(int v1, int v2) { return v1 + v2; } int main() { int(*p)(int, int) = sum; int c = p(1,7); //或者 int s = (*p)(2,8); printf("%d\n%d\n",c,s); return 0; }
然后我们看一下使用typedef以后有和不同:
#include <stdio.h> int sum(int v1, int v2) { return v1 + v2; } typedef int(*function)(int,int); int main() { function p = sum; int c = p(1,7); //或者 int s = (*p)(2,8); printf("%d\n%d\n",c,s); return 0; }
可见,使用function可以让我们指向返回值是int型,形参是int,int类型的任何函数,程序看起来优美了很多。