C语言修行之基础篇 (十一)关键字 typedef


typedef关键字的含义

typedef是C语言中一个关键字,作用是用来定义(重命名类型)

C语言为什么要存在typedef关键字?这关键字存在的意义是啥?
在C语言中的类型有2种(内建类型ADT,自定义类型UDT):
第一种是C语言编译器中特有的类型(char/int/double等)
第二种是用户自定义的类型,不是语言自带的是程序员自定义类型(数组类型,结构体类型,函数类型等)
在编程中有的时候使用的自定义类型太长了,用起来不方便。就用到typedef进行重命名为一个短点名字。
typedef是给类型重命名的,也就是说typedef加工出来的都是类型,而不是变量。

typedef与#define宏的区别

#define dpChar char *                 
typedef char * tpChar 				—— 重命名类型
dpChar p1,p2; 					// 展开:char *p1,p2;      char *p1;char p2;
tpChar p1,p2;                	// 等价:char *p1; char *p2;

注意:
当用#define去重命名变量类型时,只有p1定义为指针,而p2定义为char型变量。这是由于编译器在预处理阶段就会将代码中的dpChar地方原原本本的替换成char *,其他都不会改变。所以会出现两种定义不一样的现象。
typdef关键字不是在编译器预处理阶段替换的,他会在编译阶段以重命名类型的方式替换。

typedef与结构体

C语言中typedef与结构体结合使用是最常见的。这里列举几种常见的typdef重命名方式以及定义、赋值、使用的过程。

// 重命名
typedef struct
{
float   fTemperature;   
uint8_t ucHumidity;            

void (*Measure_Period_Mode)(void);  
}SHT30_t;

 // 方式一 定义并赋值
 SHT30_t SHT30 = 
{
0.0,
0,
Measure_Period_Mode
};

// 方式二  定义并赋值   
SHT30_t SHT30;                     // 结构体变量
SHT30.fTemperature = 0.0;
SHT30.ucHumidity = 0;
SHT30.Measure_Period_Mode = Measure_Period_Mode;

// 方式三 定义并赋值   
SHT30_t *SHT30;                    // 结构体指针
SHT30->fTemperature = 0.0;
SHT30->ucHumidity = 0;
SHT30->Measure_Period_Mode = Measure_Period_Mode;

// 在重命名结构体时,命名了两种:SHT30_t结构体类型,*pSHT30_t结构体指针类型
typedef struct
{
float   fTemperature;   
uint8_t ucHumidity;            

void (*Measure_Period_Mode)(void);  
}SHT30_t,*pSHT30_t;

// 使用结构体指针类型定义
pSHT30_t = &SHT30;

typedef与const结合

typede int* PINT;			const PINT p2;         	// 相当于int *const p2
typede int* PINT;			PINT const p2;  		// 相当于int *const p2
typede const int* PINT;     PINT p2;				// 相当于const int * p2

注意:
typedef和const结合的时候第一种和第二种方式使用的方式,const修饰的都是p2指针。只有第三种方式const才能修饰p2指针所指向的那个内存值。

使用typedef的意义

1、简化类型的描述,尤其在函数指针中的使用
2、在很多编程体系下,人们倾向于不使用Int、double等C语言内建类型,因为这些类型本身和平台有关的。(如int在32位和64位中位数是不一样的)为了解决问题,很多程序使用自定义中间类型来缓冲使用。这样在将32位中的程序移植到64位的系统中时,只要更改重定义就完美解决问题。特别是在linux复杂程序中使用很广。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bazinga bingo

您的鼓励就是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值