美文网首页C&C++程序员
c语言中的关键字typedef(别名)的用法

c语言中的关键字typedef(别名)的用法

作者: 一只小蝉儿 | 来源:发表于2016-05-19 13:52 被阅读1525次

    在iOS开发中,常常用typedef来为复杂的声明定义简单的别名,一致没有系统的总结过,今天就小小的总结学习下。不足及错误之处还望指正


    typedef声明定义与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了。

    一、typedef作用简介:

    我们可以使用typedef关键字为各种数据类型定义一个新名字(别名).
    例:

    typedef int SINT;
    typedef unsigned  int SUNINT;
    typedef float SFLOAT;
    

    以上我们对int、unsigned int、float分别起了个别名,然后我们用这三个别名定义三个变量
    例:

     SINT i=20;
     SUNINT i1=23;
     SFLOAT i2=24.56;
     printf("%d,%d,%.2f",i,i1,i2);
    

    打印结果:20,23,24.56,说明和原来的类型结果是一样的。
    另外,要知道的是,给类型起别名后,原来的类型仍是可以使用的,还有,我们也可以在别名的基础上再起一个别名;
    例:

    typedef float SFLOAT;
    typedef SFLOAT FFLOAT;
    

    二、typedef与指针

    除了可以给基本的数据类型起别名,typedef也可以给指针起别名
    例:

    typedef char*Pstring;
    

    然后使用下Pstring
    例:

     Pstring str="This is a string!";
     printf("%s",str);
    

    打印结果:This is a string!

    三、typedef与结构体

    1、默认情况下结构体变量的使用

    定义一个结构体,例:

    struct MyPoint{
        float x;
        float y;
    };
    

    定义结构体变量,例:

    struct MyPoint point;
    point.x=10.0f;
    point.y=20.0f;
    

    默认情况下,我们定义结构体变量需要带个struct关键字。

    2、使用typedef给结构体起别名

    例:
    定义一个结构题:

    struct MyPoint{
        float x;
        float y;
    };
    

    起别名:

    typedef struct MyPoint SPoint;
    

    定义结构体变量,例:

        SPoint p;
        p.x=10.0f;
        p.y=10.0f;
    

    我们给结构体MyPoint起了个别名SPoint,然后我们用SPoint定义结构体变量p,就不用再带上struct关键字了
    另外,上边的给结构体起别名可以简写为下列样式
    (1)定义一个结构体,顺便起别名

    typedef struct MyPoint{
        float x;
        float y;
    }Point;
    

    (2)可以省略结构体名称

    typedef struct{
        float x;
        float y;
    }Point;
    

    四、typedef与指向结构体的指针

    typedef可以给指针、结构体起别名,当然也可以给指向结构体的指针起别名 。
    定义一个指向结构体的指针并起别名,例:

    typedef struct {
        float x;
        float y;
    }SPoint;
    typedef SPoint* SP;
    

    利用指针变量访问结构体成员,例:

    SPoint point={10.0f,20.0f};
    SP p=&point;
    printf("x=%f,y=%f",p->x,p->y);
    

    输出结果:x=10.000000,y=20.000000

    五、typedef与枚举类型

    使用typedef给枚举类型起别名也可以使代码简洁。

    1、默认情况下枚举变量的使用

    定义枚举类型,例:

    enum MySeason{
        spring,
        summer,
        autumn,
        winter
    };
    

    定义枚举变量,例:
    enum MySeason season=spring;

    2、使用typedef给枚举起别名

    给上述枚举类型起别名,例:

    typedef enum MySeason MySeason;
    

    定义枚举变量,例:

    MySeason season=spring;(此处可以省略关键字enum)
    

    (1)定义枚举类型,并且起别名

    typedef enum MySeason{
        spring,
        summer,
        autumn,
        winter
    }MySeason;
    

    (2)可以省略枚举名称

    typedef enum {
        spring,
        summer,
        autumn,
        winter
    }MySeason;
    

    六、typedef与指向函数的指针

    1.函数指针

    定义一个sum函数,计算a和b的和,例:

    int sum(int a,int b)
    {
        int c=a+b;
        printf("%d+%d=%d",a,b,c);
        return c;
    }
    

    定义一个指向sum函数的指针变量p,例:

     int(*p)(int ,int)=sum;
    

    利用指针变量p调用sum函数,例:

      (*p)(500,20);
    

    结果控制台显示:500+20=520

    2、使用typedef给指向函数的指针类型起别名

    给指向函数的指针类型,起了个别名叫MySum,被指向的函数接收2个int类型的参数,返回值为int类型,

    typedef int (*MySum)(int, int);
    

    定义一个指向sum函数的指针变量p ,

    MySum p = sum; 
    

    利用指针变量p调用sum函数

     (*p)(4, 5);
    

    七、typedef与#define

    1、先看一段代码

    定义一个别名和一个宏:

    typedef char* MyString;
    #define KString char*
    

    分别用上述别名和宏定义变量:

    MyString mystring="This is a String !";
    printf("mystring:%s",mystring);
    KString kstring="This is a String !";
    printf("kstring:%s",string);
    

    可以看出两者实现效果是一样的,但是实现的方式却不一样,使用typedef是给char *定义别名为String,而使用宏则是用char *代替代码中的宏名String

    2、看下面一段代码就更能体现出别名和宏的不同

    定义一个别名和一个宏:

    typedef char* MyString;
    #define KString char*
    

    分别用上述别名和宏定义变量:

     MyString str1,str2 ;
     KString str3,str4;
    

    重点来了,注意:在这种情况下,只有str1、str2、str3才是指向char类型的指针变量,str4只是个char类型的变量。

    下面简单分析一下原因:
    如果连续声明两个int类型的变量,我们可以这样写:
    int a, b;
    上面的代码相当于:
    int a; int b;
    **************以此类推
     typedef char *String1;
     String1 str1, str2;//................................(1)
    经过typedef处理后,String1也算是一种数据类型,所以(1)行的代码相当于
     String1 str1;
     String1 str2;
    由于String1就是char *,所以上面的两行代码等于
    char *str1;
    char *str2;
    **************再看看宏定义的情况
    #define String2 char*
    String2 str3, str4;................................(2)
    因为宏定义纯粹是字符串替换,用char *代替String2,所以第(2)行代码相当于
    char * str3, str4;
    其实也就相当于:
    char * str3; char str4;
    可以看出,只有str4是基本数据类型,str1、str2、str3都是指针类型。所以,以后给类型起别名,最好使用typedef,而不是使用#define
    

    所以,以后给类型起别名,最好使用typedef,而不是使用#define

    相关文章

      网友评论

      • Mr_Lucifer:2、使用typedef给结构体起别名 typedef struct MyPoint Point; SPoint 这写错了吧?
        一只小蝉儿:@Mr_Lucifer 是的,马上改 :grin: 谢谢哈!

      本文标题:c语言中的关键字typedef(别名)的用法

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