C——Typedef是什么?如何使用?有何便利之处?

2023-05-16

Typedef 是什么?

typedef是 C 语言中的一个特色功能,被用于创建新的类型名称,从名称“type def(ine)”也可以看出其功能。typedef类似于 Unix 中的alias程序的功能,为一个对象添加另外一个名称,typedef使得多个名称其实对应的是同一个程序,但是typedef操作的对象是数据类型,也就是给数据类型“起外号”,这个外号一般首字母大写,用于表示不是基础数据类型

在 C 语言中,typedef与宏#define很相似,二者的区别放到最后,因为需要先理解typedef,才能理解其与宏的区别。

Typedef 如何使用?

比如说,在 C 语言中,是有字符串的概念的:char类型的数组,最后一个元素为\0表示字符串结束。并且元素类型为char的数组其实等价于指向char的指针。但是 C 语言中并没有String这种数据类型。那么就可以使用以下语句来实现同等的功能:

//String是一个指针,*String(就是该指针的内容)等于char。换句话说,String 等于 char *
typedef char *String

从这里也可以看出来,这个外号并不是在typedef后面,而是在数据类型后面的变量的位置。(C 语言中,声明、定义变量的时候,变量是不是在类型后面?)

这时候便可以使用以下语句声明、赋值、输出“字符串”类型的数据。如下 :

#include <stdio.h>

int main()
{
    typedef char *String;
    
    String p = "abc";
    printf("%s\n", p);
    return 0;
}

输出为:

abc

再次强调,typedef并没有创建新的数据类型,只是起了个“外号”,这里的字符串也是利用 C 语言本身的机制实现的。

当然这种方法不是很常见,大多数情况不会给基础数据类型“起外号”,毕竟大部分基础数据类型的名称已经很简洁、易懂了,字符串是个例外。最常见的是在使用结构体自定义数据类型的时候,使用typedef来找一个简单些或者更易懂的同义词,而且还能让代码更简洁、高效。

比如下面这段代码,是很经典的二叉树节点的结构体:

struct tnode {
    char *word;
    int count; 
    struct tnode *left; 
    struct tnode *right; 
};

新建一个新的节点,并为其分配空间的方法如下:

struct tnode *talloc(void)
{
    return (struct tnode *) malloc(sizeof(struct tnode));
}

如果使用typedef的方法,也就是在声明结构体tnode的同时,用typedef给它起一个“外号”Treenode,如下:

typedef struct tnode {
	char *word;
	int count;
	Treeptr left;
	Treeptr right;
} Treenode;

然后再使用typedef定义一个“外号”*Treeptr

typedef struct tnode *Treeptr;

这样的话,新建并分配内存的方法不仅简洁了,而且可以写成没有指针符号*的样式,如下:

Treenode talloc(void)
{
    return (Treeptr) malloc(sizeof(struct Treenode));
}

对比一下之前的版本,是不是容易理解了许多。

Typedef 有何便利之处?

typedef#define的主要目的都是为了让代码更加简洁,也就是让代码更加美观。

除此之外,typedef还有两个优点:

  1. 参数化程序,提高可移植性。这点现在的开发用处比较少,早期计算机类的数据类型在不同的计算机上的是不同的,有些是大小,有些是数据类型的名称。如果使用typedef的话,移植的时候只要修改typedef部分即可。标准库中的size_tptrdiff_t就是两个案例。
  2. 让代码更佳易懂,因为指针在复杂数据类型中,会比较难以理解,如果使用typedef就简单多了。上一节中的talloc便是一个例子。

Typedef 与 #define 的不同之处

接下来就可以解释一下typedef#define的不同之处了。

typedef#define的主要目的都是为了让代码更加简洁,所以都有文本替换的功能。二者不同之处在于,typedef由于可以被编译器理解,所以文本替换也比宏要强大的多。

宏只能做简单的文本替换,比如直接文本替换,简单的计算和操作。下面就是一个简单的文本替换案例:

#define MAXWORD 100

int a[MAXWORD];

在编译的时候,会先直接将int a[MAXWORD];换成int a[100];,也就是文本替换,再进行编译,并不会将MAXWORD当作变量或常量去编译。所以宏所属的范围也称为预处理器(Preprocessor)。

而使用typedef的话,就可以实现一些复杂的功能。比如说下面这行代码是新建一个类型PFI,是指向有两个参数、参数类型为char *、返回值为int的函数的指针:

typedef int (*PFI)(char *, char *);

这样在声明一些函数的时候就非常方便,比如下面这个函数:

int strcmp(char *s, char *t)
{
    for ( ; *s == *t; s++, t++) {
        if (*s == '\0') {
            return 0;
        }
    }
    return *s - *t;
}

在声明的时候就可以写成:

PFI strcmp;

对比原本的

int strcmp(char *, char *);

是不是简洁了很多。如果同时有多个类似的函数,那么写在同一行也可以,更加简洁。

希望能帮到有需要的人~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C——Typedef是什么?如何使用?有何便利之处? 的相关文章

  • linux系统中重启网卡后网络不通(NetworkManager篇)

    个人博客 xff1a https 5mr xyz 一 故障现象 RHEL7 6系统 xff0c 使用nmcli绑定双网卡后 xff0c 再使用以下命令重启network服务后主机网络异常 xff0c 导致无法通过ssh远程登录系统 syst
  • Windows系统设置多用户同时远程登录

    个人博客 xff1a https 5mr xyz 一 在键盘上按Win 43 R键 也可以在开始菜单右键然后选择运行 xff0c 在运行的输入框里面输入 34 gpedit msc 34 命令 然后点击确定 二 在 计算机组策略 中依次展开
  • 在shell中把ls的输出存进一个数组变量中

    将ls的输出存到filelist数组中 xff1a c 61 0 for file in 96 ls 96 do filelist c 61 file c 43 43 done 或者 set a myfiles index 61 0 for
  • linux系统操作系统网卡漂移解决方案及问题原因

    个人博客 xff1a https 5mr xyz 一 问题描述 公司有100 150台服务器安装RHEL7 4 amp 中标麒麟7 4系统 xff0c 为方便编辑配置网卡 xff0c 使用脚本方式配置为biosname 61 0 xff0c
  • 内核报错kernel:NMI watchdog: BUG: soft lockup - CPU#1

    个人博客 xff1a https 5mr xyz 1 现象描述 系统管理员电话通知 xff0c 描述为一台服务器突然无法ssh连接 xff0c 登录服务器带外IP地址并进入远程控制台界面后 xff0c 提示Authentication er
  • Linux ls 命令提示 Input/output error

    个人博客 xff1a https 5mr xyz 一 问题描述 某一台跑批服务器硬盘无法正常读写 xff0c 提示input output error xff0c 服务器每天均需使用 xff0c 询问情况后发现服务器首先为硬盘故障 xff0
  • storcli工具的使用方法

    个人博客 xff1a https 5mr xyz 常用命令 xff1a xff08 c代表Controller xff0c e代表Enclosure xff0c s代表Slot或PD xff0c v代表ld xff09 opt MegaRA
  • xshell 连接报错 Disconnected from remote host

    个人博客 xff1a https 5mr xyz xshell连接报错 解决方法 1 登陆带外管理口远程控制台 2 查看 Var empty的属主属组和权限 xff0c empty权限需为755 3 Chmod 777 R var后导致ss
  • IPMI管理工具使用方法

    个人博客 xff1a https 5mr xyz 前言 最近需要对多台服务进行控制 xff0c 通过服务器的 BMC 控制台去控制太麻烦 xff0c 服务器刚好支持 IPMI 协议 xff0c 这里记录下常用的几条命令备忘 什么是 IPMI
  • k8s-cka考试题库

    个人博客 xff1a https 5mr xyz 本次测试的所有问题都必须在指定的cluster配置环境中完成 为尽量减少切换 xff0c 系统已对问题进行分组 xff0c 同一cluster内的所有问题将连续显示 开启TAB补全 做题前先
  • Segment Routing—BGP-LS

    BGP LS概况 BGP LS是学习多个IGP区域和区域拓扑的首选机制 BGP LS使用BGP xff0c 以可扩展的方式分发网络信息 重要的是 xff0c BGP LS还承载了IGP没有分发的信息 xff08 例如BGP对等体互联链路 x
  • OVN实验----L3互通

    概述 在L2互通基础上 xff0c 完成跨网段互访 物理拓扑 如上一个实验OVN实验 L2互通 逻辑拓扑 按照上个实验OVN实验 L2互通 的操作方式 xff0c 再配置一组容器blue xff0c 网段192 168 2 0 24 配置完
  • OVN实验----NAT

    概述 在L2互通 L3互通实验基础上通过NAT实现访问公网 架构图如下 xff0c 这里两台逻辑路由器LR1和GLR是通过一台逻辑交换机LSjoin互连的 xff0c GLR和物理网络设备通过LSlocal相连 物理拓扑 如上一个实验OVN
  • java环境变量配置好之后,cmd命令行javac为什么还是无效

    把cmd命令行关闭重启一下就好了 备注 xff1a jdk5 0之后 xff0c classpath不需要配置
  • Linux编程中的文件锁之flock

    1 场景概述 在多线程开发中 xff0c 互斥锁可以用于对临界资源的保护 xff0c 防止数据的不一致 xff0c 这是最为普遍的使用方法 那在多进程中如何处理文件之间的同步呢 xff1f 我们看看下面的图 xff1a 图中所示的是两个进程
  • 《现代医学成像科学丛书——CT原理与技术》——X射线管的基本作用

    Imaging System 医学影像 64 EnzoReventon 现代医学成像科学丛书 CT原理与技术 X射线管 xff08 球管 xff09 是CT中的重要部件 xff0c 它是设备的信号源 一 球管的基本作用 球管产生X射线的基本
  • curl -sSL https://get.rvm.io | bash -s stable curl: (7) Failed connect to api.github.com:443; 拒绝连接

    curl L get rvm io bash s stable curl sSL https get rvm io bash s stable curl 7 Failed connect to api github com 443 拒绝连接
  • Linux学习十一

    Linux学习十一 iptables服务把用于处理或过滤流量的策略条目称之为规则 xff0c 多条规则可以组成一个规则链 xff0c 而规则链则依据数据包处理位置的不同进行分类 xff0c 具体如下 xff1a 在进行路由选择前处理数据包
  • Docker - 解决容器内获取的时间和主机的时间不一样的问题

    问题背景 分别在容器和主机下执行 date 命令 可以看到 xff0c 时间是完全不一样的 解决方案 在运行容器时 xff0c 挂载 etc localtime 目录 docker run d v etc localtime etc loc
  • vscode中使用pip安装依赖包

    在vscode顶部菜单栏点击 终端 xff0c 软件下方出现终端输入框 第二步 xff1a 点击页面左下角查看python解释器路径 xff1a 在终端中进入到python解释器所在的路径 xff0c 例如输入 cd 39 C Users

随机推荐

  • ROS的2D仿真stdr安装

    ROS中仿真是很重要的一环 xff0c 一般3D仿真使用gazebo居多 xff0c 也可以使用Webots xff0c V rep xff0c stage 2D仿真有stdr xff0c turtlesim 图形显示可以用RVIZ std
  • 华为机试6 公因数集合

    题目描述 功能 输入一个正整数 xff0c 按照从小到大的顺序输出它的所有质因子 xff08 重复的也要列举 xff09 xff08 如180的质因子为2 2 3 3 5 xff09 最后一个数后面也要有空格 输入描述 输入一个long型整
  • Can't find file /root/.vnc/6be8fb894e4a:1.pid You'll have to kill the Xvnc4 process manually

    解决方法 xff1a 分别运行一下代码 xff1a rm tmp X rm tmp X11 unix X1 重新开启VNC服务 xff1a vncserver 1 geometry 1920x1080 depth 24
  • SONiC系统架构

    SONiC系统由两部分组成 xff1a 1 彼此交互的模块 2 用于交互的基础设施 xff08 集中式 xff0c 可扩展 xff09 其中用于交互的基础设施主要是一个非关系型数据库Redis引擎 xff1a 1 提供了一个无视语言的接口
  • 安卓studio jni调用第三方静态库CMakeLists配置

    通过CMakeLists调用第三方静态库需要加入以下CMake配置 xff1a add library mytaglib 这是我即将调用第三方静态库 xff0c 不需要写完整的静态库名 STATIC IMPORTED set target
  • 关于ping一下才可以连接的问题

    关于ping一下才可以连接的问题 其他地方可以ping通 xff0c telnet端口也是通的 xff0c 但是使用ssh连接 xff0c 连接不上 使用xshell工具连接一直无反应 xff0c 在xshell中ping一下对端ip就可以
  • Numpy库中的np.max与np.maximum,两者最大值求解函数有何区别?

    Numpy库中的np max与np maximum 两者最大值求解函数有何区别 在数据分析和处理中 我们经常需要求取一组数据中的最大值 在Python中 Numpy库提供了很多方便易用的数学函数 其中最大值求解函数包括np max和np m
  • 如何在STM32上部署卷积神经网络(纯C语言搭建)

    0 前言 本文是什么 假如你已经使用PyTorch或者TensorFlow训练了一个卷积神经网络 xff0c 得到了各层参数 xff0c 却希望用C语言把这个部署到STM32等单片机上 xff0c 那么就可以看看这篇文章啦 本文虽然主要介绍
  • openstack怎么查看日志(小白适用实操版2019)

    首先从最简单的开始 xff0c 新建一个虚拟机 xff08 Launch Instance xff09 并查看其日志 1 在网页上登录搭建好的openstack虚机 xff08 名称为op1 xff09 的dashboard界面 2 远程S
  • Windows vscode连接远程服务器+用ssh密钥实现免密码登录+使用远程jupyter

    这篇文章是我最先发在某乎上的 xff0c 链接 xff1a https zhuanlan zhihu com p 582216948 记录一下自己折腾的记录 xff0c 免得自己忘掉 首先 xff0c 在Windows电脑上的vscode里
  • 华三交换机配置静态链路聚合

    拓扑如下 xff1a 1 配置链路聚合 SW1设备配置 lt H3C gt system view 进入系统视图 H3C sysname sw1 将设备命名为sw1 sw1 interface bridge aggregation 1 创建
  • 华为设备链路聚合(LACP模式)

    配置要求 xff1a SW1与SW2通过G0 0 1 G0 0 2 G0 0 3的链路聚合进行连接 xff0c 链路聚合要有两条活动链路 xff0c 一条冗余链路 在SW1上配置vlan10 1 1 1 254 24的网关 xff0c 并将
  • Linux——find -type命令

    find type命令查找某一类型的文件 xff0c 后面跟着不同的字母表示不同的文件类型查询manual如下 xff1a 字母文件类型bblock buffered specialccharacter unbuffered special
  • Github账户开启双重验证(two-factor authentication)

    GitHub官方教程是这个 xff1a https docs github com en github authenticating to github configuring two factor authentication 但是过程没
  • tab stop(制表符)是什么?

    在 The C Programming Language 中有一道题是这样的 xff1a Exercise 1 20 Write a program detab that replaces tabs in the input with th
  • HDFS中读取数据——Java接口实现

    这一篇文章 xff0c 我们来深入了解一下Hadoop中的FileSystem类 xff0c 它是与Hadoop的某一文件系统进行交互的API 虽然我们主要聚焦于HDFS实例 xff0c 即DistributedFileSystem xff
  • C——char(字符串)转int

    有时候需要对输入的数字进行计算之类的操作 xff0c 这时候需要将char转int类型 char是一个单独字节 xff0c 可以保存一个本地字符集的内容的类型 一般使用char 的格式来使用 int就是一个范围较小的无符号整数类型 注意 x
  • Mac缓解或关闭鼠标加速

    Mac上鼠标会有加速 xff0c 就是鼠标移动的越快 xff0c 移动距离就越远 如果是Windows设备刚转Mac或者是Windows和Mac一起用可能会非常难受 首先苹果搞这个是苹果鼠标移动距离单位是像素 xff0c 并且Mac分辨率都
  • SwiftUI——延迟执行操作/定时自动执行操作(使用计时器Timer以及异步DispatchQueue.main.asyncAfter)

    在开发软件的过程中 xff0c 我们不仅需要用户点击的时候执行操作 xff0c 有时候还需要定时自动进行一些操作 比如最常见的开屏广告倒计时关闭 xff0c 还比如一些动画效果 实现这些一般有两种方法 xff1a 一种是使用计时器Timer
  • C——Typedef是什么?如何使用?有何便利之处?

    Typedef 是什么 xff1f typedef是 C 语言中的一个特色功能 xff0c 被用于创建新的类型名称 xff0c 从名称 type def ine 也可以看出其功能 typedef类似于 Unix 中的alias程序的功能 x