这篇文章将学会看懂和使用typedef 关键字。
(1)对已有的数据类型重命名
首先要搞清楚是typedef 关键字对已有的数据类型重命名而非重新定义一个新的数据类型。这样做其中的原因如下所示。
1)原来的数据类型比较长,可以用比较简单的写法来替代,
比如 常见的用法如下所示
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
以后就可以直接用u8 u16 u32来分别定义无符号字符类型、无符号短整型、无符号整型。
u8 c = 'a';
u16 i = 100;
u32 j = 200;
2)提高移植性
当我们在不同的平台上进行代码移植时,可提高移植性。比如在A平台上int 为占32个字节,在B平台上short int占32 个字节,那么在A平台上的typedef unsigned int u32;移植到B平台时只需要将 typedef unsigned int u32;改成typedef unsigned short u32;就可以,其余涉及到u32的代码不需要修改。
(2)结合struct 、函数指针的使用
1)与结构体struct的结合
在实际的项目中经常会用到定义一种新的结构体类型,这时候就可以结合typedef关键字达到简化的目的。
代码如下所示:
#include <stdio.h>
  • //演示typedef关键字结合struct的用法
  • //用typedef关键字重命名,一种是结构体类型Student_str,
  • //一种是结构体指针类型Student_ptr
  • typedef struct student
  • {
  •         int age;
  •         //其它一些额外的成员变量
  • }Student_str, *Student_ptr;
  • int main(int argc, char** argv)
  • {
  •         Student_str s1; //也可以用struct student s1;
  •         Student_ptr s1_ptr;//也可以用struct student *s1_ptr;
  •                 // struct student s1;
  •         // struct student *s1_ptr;
  •                 return 0;       
  • }
  • 复制代码
    image.png

    typedef结合struct的用法代码


    2)与函数指针的结合
    比如在Linux应用编程中常见的信号操作函数signal,有如下的定义。
    typedef void (*sighandler_t)(int); //函数指针sighandler_t
    sighandler_t signal(int signum, sighandler_t handler);
    测试代码如下所示:
    #include <stdio.h>
  • //演示typedef关键字结合函数指针的用法
  • //用typedef关键字定义函数指针p_fun.这个函数指针带有2个int类型的参数,
  • //返回值也是int类型
  • typedef int (*p_fun)(int a, int b);
  • int add(int a, int b);//函数声明
  • int main(int argc, char** argv)
  • {
  •         //可以使用p_fun来定义对应的变量,之后就是赋值,解引用
  •         p_fun fun=add;//编译能通过也说明,函数名本身也是一个指针,是指向函数第一句代码的地址
  •         printf("结果为: %d \n", fun(1, 2));
  •         printf("结果为: %d \n", (*fun)(1, 2));
  •        
  •         return 0;       
  • }
  • //定义函数
  • int add(int a, int b)
  • {
  •         return (a + b);
  • }
  • 复制代码
    image.png

    typedef结合函数指针代码


    指向函数的指针可以调用它所指向的函数。比如这里的fun函数指针指向add函数。可以不需要使用解引用操作符比如fun(1, 2),而直接通过指针调用此函数比如(*fun)(1, 2)。
    (3)与#define的区别
    注意:在重命名指针类型的时候有区别
    代码本意让p1,p2 p3 p4的类型都为unsigned char *,但是结果p4变量为unsigned char类型。代码如下所示:
    #include <stdio.h>
  • //演示typedef关键字与define的区别
  • //用typedef和define分别重命名指针类型
  • typedef unsigned char * u8_p;
  • #define uchar_p unsigned char *
  • int main(int argc, char** argv)
  • {
  •         unsigned char c1 = 'a';
  •         //p1,p2 p3确实是unsigned char * 类型,p4为unsigned char类型
  •         u8_p p1,p2;
  •         uchar_p p3,p4;
  •        
  •         p1 = &c1;
  •         p2 = &c1;
  •         p3 = &c1;
  •         p4 = &c1;//换成 p4 = c1;就不会有警告产生
  •        
  •         return 0;       
  • }
  • 复制代码
    image.png

    typedef与define用法区别


    因此在遇到上面这种情况时,使用typedef或者对指针变量进行单独定义,避免出错。
    以上就是所总结的typedef的用法,这些都是必须要掌握的,上机实战,理解才是王道。
    喜欢的话给个点赞和评论