美文网首页程序员
【C语言笔记】<二十七>typedef和宏定义的区别

【C语言笔记】<二十七>typedef和宏定义的区别

作者: 大基本功 | 来源:发表于2018-05-16 09:47 被阅读25次
    #include <stdio.h>
    
    /*
     什么是typedef, 它有什么作用
     typedef可以给一个已知的数据类型起别名 (外号)
     
     利用typedef给数据类型起别名的格式:
     
     typedef 原有的数据类型 别名(外号);
     
     注意: 
     1. typedef不仅能给系统原有的数据类型起别名, 也可以给一个自定义的数据类型起别名
     2. 利用typedef给数据类型起别名, 并不会生成一个新的数据类型, 仅仅是给原有的类型起了一个别名而已
     */
    
    int sum(int v1, int v2)
    {
        return v1 + v2;
    }
    
    int minus(int v1, int v2)
    {
        return v1 - v2;
    }
    
    // 注意: 如果是给指向函数的指针起别名, 那么指向函数的指针的指针名称就是它的别名
    // functionPotinter == int(*functionPotinter)(int , int)
    typedef int(*functionPotinter)(int , int);
    int main(int argc, const char * argv[]) {
       
        // 9如何定义变量 :   数据类型 变量名称;
    //    int (*sumP)(int , int ) = sum;
        functionPotinter sumP = sum;
        printf("sum = %i\n", sumP(10 , 20));
        
    //    int (*minusP)(int, int) = minus;
        functionPotinter minusP = minus;
        printf("minus = %i\n", minusP(20, 10));
        return 0;
    }
    
    // ----------------------------给指针起别名----------------------------
    // String == char *
    typedef char * String;
    void test4()
    {
        //    char *name = "lnj";
        // 注意: 如果给指针起别名之后, 那么以后利用别名定义变量就不用再加*了
        String name = "lnj";
        printf("name = %s\n", name);
        
        
    }
    
    // ----------------------------给枚举类型起别名----------------------------
    
    // 1.先定义枚举类型, 再给枚举类型起别名
    /*
     enum Gender
     {
     kGenderMale,
     kGenderFemale
     };
     typedef enum Gender SEX;
     */
    
    // 2.定义枚举类型的同时给枚举类型起别名
    /*
     typedef enum Gender
     {
     kGenderMale,
     kGenderFemale
     } SEX;
     */
    
    // 3.定义枚举类型的同时给枚举类型起别名, 并且省略枚举原有类型名称
    typedef enum
    {
        kGenderMale,
        kGenderFemale
    } SEX;
    
    void test3()
    {
        
        // 给枚举起别名
        //    enum Gender sex;
        SEX sex;
        sex = kGenderMale;
        /*
         定义枚举变量有3种方式
         1.先定义枚举类型, 再定义枚举变量
         2.定义枚举类型的同时定义枚举变量
         3.定义枚举类型的同时定义枚举变量, 并且省略枚举类型名称
         */
        /*
         enum Gender2
         {
         kGenderMale2,
         kGenderFemale2
         } sex2;
         sex2 = kGenderFemale2;
         
         enum
         {
         kGenderMale3,
         kGenderFemale3
         } sex3;
         sex3 = kGenderFemale3;
         */
        
    }
    // ----------------------------给结构体类型起别名----------------------------
    
    
    // 1.先定义结构体类型, 再给类型起别名
    /*
     struct Person
     {
     int age;
     double height;
     char *name;
     };
     // SPerson == struct Person
     typedef struct Person SPerson;
     */
    
    // 2.定义结构体类型的同时, 给结构体类型起别名
    /*
     typedef struct Person
     {
     int age;
     double height;
     char *name;
     } SPerson;
     */
    
    // 3.定义结构体类型的同时, 给结构体类型起别名, 并且省略掉原有类型的名称
    
     typedef struct
     {
     int age;
     double height;
     char *name;
     } SPerson;
    void test2()
    {
        /*
         // 给构造类型起别名
         struct Person
         {
         int age;
         double height;
         char *name;
         };
         */
    //    struct Person sp0;
        SPerson sp;
        SPerson sp1;
        SPerson sp2;
        SPerson sp3;
        SPerson sp4;
        /*
         结构体变量的定义方式
         1.先定义类型再定义变量
         2.定义类型的同时定义变量
         3.定义类型的同时定义变量, 并且省略类型名称
         */
    }
    
    // ----------------------------给基本数据类型起别名----------------------------
    // Integer == int
    typedef int Integer;
    typedef Integer myInt;
    // int float doulbe char
    void test1()
    {
        int num = 10;
        printf("num = %i\n", num);
        
        Integer age = 30;
        printf("age = %i\n", age);
        
        myInt score = 99;
        printf("score = %i\n", score);
    }
    
    
    typedef和宏定义的区别
    #include <stdio.h>
    
    typedef int myInt;
    #define Integer int
    
    typedef char * String;
    #define MY_STRING char *
    // 一般情况下如果要给数据类型起一个名称建议用typedef, 不要用define
    int main(int argc, const char * argv[]) {
        /*
        int num = 10;
        printf("num = %i\n", num);
        
        myInt age = 30;
        printf("age = %i\n", age);
        
        Integer score = 99;
        printf("score = %i\n", score);
         */
        /*
        char *name = "lnj";
        printf("name = %s\n", name);
        
        String name2 = "lmj";
        printf("name2 = %s\n", name2);
        
        MY_STRING name3 = "lk";
        printf("name3 = %s\n", name3);
         */
        
        String name1, name2;
        name1 = "lnj";
        name2 = "lmj";
        printf("name1 = %s, name2 = %s\n", name1, name2);
        
    //    char *name3, name4; // char *name3; char name4;
        MY_STRING name3, name4;
        name3 = "lk";
        name4 = "xb";
        printf("name3 = %s, name4 = %s\n", name3, name4);
        return 0;
    }
    
    

    相关文章

      网友评论

        本文标题:【C语言笔记】<二十七>typedef和宏定义的区别

        本文链接:https://www.haomeiwen.com/subject/risddftx.html