一、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类型的任何函数,程序看起来优美了很多。