你知道C语言的typedef关键字吗?

news2024/10/6 12:32:43

本篇博客主要讲解C语言中的typedef关键字。typedef的作用是类型重定义,可以理解为给类型起一个别名。我主要从3个方面来讲解:

  1. typedef内置类型。
  2. typedef自定义类型。
  3. typedef和#define的区别。

typedef

1.typedef内置类型

typedef可以给一个类型起“别名”。比如,如果我这么写:

typedef int zhangsan;

我就给int起了个别名叫"zhangsan"。此时,int就等价于zhangsan,比如int a = 0;zhangsan a = 0;等价。当然,实际使用时,不会起这样的名字,而是根据实际情况,起适当的名字。

举个例子,有一个类型叫unsigned int,我觉得这个类型太长了,就这么写:

typedef unsigned int uint;

此时,所有需要unsigned int类型的地方,就可以用uint来替代。比如,下面两行代码等价。

unsigned int a = 10;
uint a = 10;

当然,不建议把类似unsigned int这样的类型起类似uint这样的别名,因为这样会降低可读性。

2.typedef自定义类型

typedef自定义类型是一个很常见的用法,尤其是对于结构体。比如:

struct Node
{
	int data;
	struct Node* next;
};

这是一个链表结点的结构体。C语言中,如果用结构体类型创建结构体变量,是不能省略struct的。比如:

struct Node head;

每次都写struct Node是非常复杂的,有么有什么方法可以省略掉struct,直接写类似Node head;呢?

这就可以使用typedef。

typedef struct Node
{
	int data;
	struct Node* next;
}Node;

以上的写法中,就给struct Node起了个别名叫"Node",所以就可以直接写类似Node head;来定义结构体变量了。当然,类似自定义类型,写:

typedef struct Node Node;

也能达到同样的效果。

另外,如果这么写:

typedef struct Node
{
	int data;
	struct Node* next;
}Node, *pNode;

就是给struct Node*起了个别名叫pNode。

3.typedef和#define的区别

typedef可以给类型起别名,#define只是完成替换,它们有本质的区别。比如:

typedef int* pint;
#define PINT int*

为了区分两者,我用大写的PINT来代表#define定义出来的宏。此时如果有下面一段代码,是什么意思呢?

pint a, b;
PINT c, d;

先说a和b。由于typedef给int*起了个别名叫pint,也就是说,a和b的类型都是int*类型。

但是,c和d都是int*类型吗?并不是,这就容易引起误解。因为#define是在预处理阶段完成文本替换,会把PINT直接替换成int*,此时的代码就变成了:

int* c, d;

等价于int *c, d;,c是int*类型的,但是d只是一个int类型的变量。

为了避免引起误解,一般建议类型的重定义都使用typedef而不是#define。

总结

  1. typedef用于给类型重定义,可以理解为给类型起了个别名。
  2. typedef一般这么用:typedef 原类型名 新类型名;
  3. 自定义类型尤其喜欢使用typedef,从而达到定义变量时省略struct等关键字的效果。
  4. 一般类型的重定义都使用typedef,而不是#define,因为#define容易引起误解。

感谢大家的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器部署前后端分离项目

服务器部署前后端分离项目 目录服务器部署前后端分离项目一、安装环境安装jdk1、在/usr/local目录下创建jdk文件夹,并将jdk安装包放到/usr/local/jdk包下并解压1.1通过文件传输工具将jdk包上传到服务器上1.2输入解压命令1.3解压完成,生成下面的文件2、配…

学习周报4/9

文章目录前言文献阅读摘要简介方法结论时间序列预测总结前言 本周阅读文献《Improving LSTM hydrological modeling with spatiotemporal deep learning and multi-task learning: A case study of three mountainous areas on the Tibetan Plateau》,文章主要基于…

多种方法解决SLF4J: Defaulting to no-operation (NOP) logger implementation的错误

文章目录1. 复现错误2. 分析错误3. 解决错误4. 解决该错误的其他方法1. 复现错误 今天在编写使用Quartz执行定时任务的方法,如下代码所示: public class QuartzTest {public static void main(String[] args) throws SchedulerException {// 1、创建Sch…

大数据系列——Hive理论

概述 Hive是一个数据仓库管理工具,将结构化的数据文件映射为一张数据库表,并提供类SQL(HQL)查询功能。由Facebook实现并开源,最后捐赠给Apache发展为顶级项目。 以RDBMS数据库为元数据存储服务, 以Hadoop HDFS来存储…

44.节流与防抖

目录 1 防抖 1.1 概念 1.2 应用场景 1.3 lodash防抖 1.4 手写防抖 2 节流 2.1 概念 2.2 应用场景 2.3 lodash节流 2.4 手写节流 2.5 记录视频上一次的播放位置 1 防抖 1.1 概念 防抖就是让事件触发后延迟n秒后再执行回调函数,在这n秒内如…

014:Mapbox GL添加draw组件,绘制点、线、多边形、删除

第014个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加draw组件,绘制点、线、多边形,删除所选元素。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共78行)相关API参考:专栏目标示例效果 配置方…

用于平抑可再生能源功率波动的储能电站建模及评价(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

项目部署---手工部署项目

手工部署项目 在ideal中开发springboot项目并打成jar包 将jar包上传到Linux服务器 mkdir /usr/local/app 创建目录,将项目jar包放到此目录 ![](https://img-blog.csdnimg.cn/83cf26b151874637a2dfeda7dd05e4cf.jpeg) 启动SpringBoot程序 检查防火墙,…

电脑蓝屏问题排查

最近电脑安装了最新win10,更新最新的驱动以后,开机几分钟后,会蓝屏重启,报错为: DRIVER_POWER_STATE_FAILURE 下载蓝屏分析工具BlueScreenView 问题出在ntoskrnl.exe bing搜索给出了二种解决方案: 1&a…

软件测试应届生社招找工作面试会遇到哪些坑?(全网最全避坑指南)

目录 找工作的最佳时间 是否裸辞 我们要做哪些准备工作 准备一段自我介绍 准备一份pdf简历 社招找工作的渠道:内推 找工作的最佳时间 社招找工作的最佳时间是:金三银四。也就是春节后的三月份和四月份。 为什么是金三银四呢?因为每年的…

HTML5 Geolocation

文章目录HTML5 Geolocation定位用户的位置浏览器支持HTML5 - 使用地理定位处理错误和拒绝在地图中显示结果给定位置的信息getCurrentPosition() 方法 - 返回数据Geolocation 对象 - 其他有趣的方法HTML5 Geolocation HTML5 Geolocation(地理定位)用于定位…

【SQL Server】数据库开发指南(五)T-SQL 高级查询综合应用与实战

T-SQL 是 SQL Server 的专用版本,提供了一组强大的高级查询功能,包括聚合函数、子查询、连接、视图、窗口函数、共享表达式、递归查询等。这些功能使得 T-SQL 可以轻松处理大量数据,并支持各种复杂的查询和数据操作。本文将介绍 T-SQL 的一些…

Debian 10配置apt源常见问题

目录 一:配置本地apt源没有发现文件 解决方案 二:apt下载bind9报错E: Package bind9 has no installation candidate 方法一: 方法二:更新不报错但是安装依旧报错E: Package bind9 has no installation candidate 一&#xff…

密码加密——加盐算法(两种方式)

加盐算法 文章目录加盐算法手写一个加盐算法spring security密码安全是一件很重要的事情,所以一定要谨慎对待 常见的主要是3种方式 明文MD5加密加盐算法 首先明文肯定是不可取的,在数据库中明文存储密码风险实在是太大了 简单来说,使用MD…

DataGrip连接数据库设置(MySQL、Oracle、SQL Server)

一、DataGrip连接MySQL 1.1 配置信息 1.2 测试查询employees库中departments表信息 employees为测试库,具体来源,参考这篇文章 下载并导入MySQL示例数据库employees 。 1.3 测试查询employees库中employees表信息 二、DataGrip连接Oracle 将SID改为o…

「字节跳动实习期间」免费专栏发布+服务端知识架构

字节跳动实习期间专栏内容 主要放在字节跳动实习期间个人的一些笔记,通过整理放出,并保持不断迭代 同时这里并不会放涉及字节内部的文档和知识,只是博主整理的网上已有的知识 欢迎同学们关注专栏、互相学习、共同进步,我也会在…

vue-cli(vue脚手架方式搭建)

1.首先安装node前端环境,可以帮助我们去下载其他的组件 下载完成后,去自己的电脑找到node的文件路径,复制去配置环境变量,在path中配 环境搭配完成后,在cmd中进行测试 ,输入一下两个命令进行测试 2.在hbuilderX中创建一个vue-cli项目(标准的前段项目) 3.组件路由 (1)安装 v…

java基础学习-5

Java基础学习-5快乐算法二分查找小总结分块查找冒泡选择插入排序递归算法快速排序小总结ArraysLambda表达式小总结Lambda表达式的省略写法小练习集合进阶CollectionColection的遍历方式迭代器遍历小总结增强for循环Lambda表达式遍历小总结List集合List的遍历方式迭代器遍历增强…

【redis】集群

redis集群 集群有点难 大部分的实操命令没有记录 希望能二刷补上 18:46 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录redis集群前言一、集群是什么?二、集群能干嘛?三、集群算法-分片-槽…

redis——分布式

持久化RDBAOF主从同步全量同步增量同步哨兵sentinel作用服务状态监控选举master分片集群作用散列插槽 hash slot集群伸缩故障转移多级缓存持久化 RDB redis备份文件(快照) 可压缩,耗费cpu默认在服务停止时触发可以设置一定条件&#xff0c…