这篇文章将学会看懂和使用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; }
复制代码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); }
复制代码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; }
复制代码typedef与define用法区别
因此在遇到上面这种情况时,使用typedef或者对指针变量进行单独定义,避免出错。
以上就是所总结的typedef的用法,这些都是必须要掌握的,上机实战,理解才是王道。
喜欢的话给个点赞和评论吧