C语言关键字typedef详解

typedef详解

typedef和基本类型

typedef是c语言的关键字,作用是为一种数据类型定义一个新的名字,最简单的用法是用typedef为C语言基本类型取一个别名。

char a = 'H';
typedef char CHAR;
CHAR b = 'E';
printf("%c %c\n",a,b);

我们发现此时CHAR就已经替代了char这个原本的关键字。

最常见的用法就是:

typedef enum { true=1, false=0 } bool;

typedef signed char            int8_t; 
typedef signed short int       int16_t; 
typedef signed int             int32_t;  
typedef signed long long int   int64_t; 
typedef unsigned char          uint8_t; 
typedef unsigned short int     uint16_t; 
typedef unsigned int           uint32_t; 
typedef unsigned long long int uint64_t; 

在做一些嵌入式开发的过程中,我们需要自己定义bool类型,定义一些很明确的直接表示字符位数的类型。

typedef和struct

typedef也可以用来给结构体取一个新的名字。

常用的声明方式为

typedef struct student {
	int age;
	char name[20];
} Stu;

这样就把一个 struct student 类型直接简化为了 Stu 类型。

举个例子:

#include <stdio.h>
#include <malloc.h>

typedef struct stack {
    int eax;
    int ebx;
    int ecx;
    int edx;
} STACK;


int main() {
    printf("%d \n", sizeof(STACK));
    printf("%d \n", sizeof(struct stack));
    STACK *p1 = (STACK *) malloc(sizeof(STACK));
    struct stack *p2 = (struct stack *) malloc(sizeof(struct stack));
    p1->eax = 1;
    p1->ebx = 1;
    p1->ecx = 1;
    p1->edx = 1;
    return 0;
}

typedef和数组

在需要重复定义数组的时候

char line[81]; 
char text[81];

// 可以像下面这样定义
typedef char Line[81]; 
Line text, secondline;

typedef和指针

我们可以像下面这样隐藏指针语法

typedef char* pstr; 
pstr str = "abcdef";
int mystrcmp(pstr, pstr);

typedef和函数

函数指针一般用于回调,回调就涉及到函数指针,当我们的程序中有以下函数

void printHello(int i);

然后我们要定义一个函数指针,指向printHello,并且调用这个方法,代码如下:

void (*pFunc)(int);            // 定义函数指针
pFunc = &printHello;           // 函数指针指向printHello
(*pFunc)(110);                 // 调用printHello

大家可以看到,声明一个函数指针是比较复杂的,尤其是当你要在多处地方声明同一个类型的函数指针变量,代码更加复杂,所以有下面简化的做法:

typedef void (*PrintHelloHandle)(int);

PrintHelloHandle pFunc;
pFunc = &printHello;
(*pFunc)(110);

以后其他地方的程序需要声明类似的函数指针,只需要下面代码:

PrintHelloHandle pFuncOther;

这样代码会变得更加简介

typedef结论

typedef 行为有点像 #define 宏,用其实际类型替代同义字。但是并不是简单的替换,他会在编译时由编译器进行一些推断,所以typedef的行为有一些复杂。把这些复杂的行为拆开看,其实还是一些替换,只是为了代码简洁,typedef并不创造新的类型。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言typedef是一个关键字,其作用是为已有类型创建一个新的名称。通过typedef,可以给某个类型起一个别名,方便程序员在代码使用这个别名来代替原有的类型名。这样可以提高代码的可读性和可维护性。typedef的语法形式为:typedef 原类型名 新类型名; 例如,可以使用typedef来为int类型创建一个别名u_int,为int*类型创建一个别名int_p,为数组类型创建一个别名a,为结构体类型创建一个别名stu_t。使用typedef定义的别名可以像原类型一样使用。 另外,typedef还支持多层嵌套的形式,可以通过多次typedef来定义更复杂的类型别名。 最后需要注意的是,typedef是一种存储类的关键字,不能与其他存储类关键字(如auto、extern、static、register等)出现在同一个表达式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C语言typedef关键字](https://blog.csdn.net/qq_52670477/article/details/120009659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [typedef介绍](https://blog.csdn.net/liitdar/article/details/80069638)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LyaJpunov

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值