C语言typedef的用法详解

C语言typedef的用法详解C 语言允许为一个数据类型起一个新的别名 就像给人起 绰号 一样 起别名的目的不是为了提高程序运行效率 而是为了编码方便 例如有一个结构体的名字是 stu 要想定义一个结构体变量就得这样写 structstustu struct 看起来就是多余的 但不写又会报错 如果为 structstu 起了一个别名 STU 书写起来就简单了 STUstu1 这种写法更加简练 意义也非常明

C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。

起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写:

struct stu stu1; 

struct 看起来就是多余的,但不写又会报错。如果为 struct stu 起了一个别名 STU,书写起来就简单了:

STU stu1; 

这种写法更加简练,意义也非常明确,不管是在标准头文件中还是以后的编程实践中,都会大量使用这种别名。

使用关键字 typedef 可以为类型起一个新的别名。typedef 的用法一般为:

typedef oldName newName; 

oldName 是类型原来的名字,newName 是类型新的名字。例如:

typedef int INTEGER; INTEGER a, b; a = 1; b = 2; 

INTEGER a, b;等效于int a, b;。

typedef 还可以给数组、指针、结构体等类型定义别名。先来看一个给数组类型定义别名的例子:

typedef char ARRAY20[20]; 

表示 ARRAY20 是类型char [20]的别名。它是一个长度为 20 的数组类型。接着可以用 ARRAY20 定义数组:

ARRAY20 a1, a2, s1, s2; 

它等价于:

char a1[20], a2[20], s1[20], s2[20]; 

注意,数组也是有类型的。例如char a1[20];定义了一个数组 a1,它的类型就是 char [20]。

又如,为结构体类型定义别名:

typedef struct stu{ 
    char name[20]; int age; char sex; } STU; 

STU 是 struct stu 的别名,可以用 STU 定义结构体变量:

STU body1,body2; 

它等价于:

struct stu body1, body2; 

再如,为指针类型定义别名:

typedef int (*PTR_TO_ARR)[4]; 

表示 PTR_TO_ARR 是类型int * [4]的别名,它是一个二维数组指针类型。接着可以使用 PTR_TO_ARR 定义二维数组指针:

PTR_TO_ARR p1, p2; 

按照类似的写法,还可以为函数指针类型定义别名:

typedef int (*PTR_TO_FUNC)(int, int); PTR_TO_FUNC pfunc; 

示例 为指针定义别名。

#include  
     typedef char (*PTR_TO_ARR)[30]; typedef int (*PTR_TO_FUNC)(int, int); int max(int a, int b){ 
    return a>b ? a : b; } char str[3][30] = { 
    "http://www.baidu.com", "百度搜索引擎", "C-Language" }; int main(){ 
    PTR_TO_ARR parr = str; PTR_TO_FUNC pfunc = max; int i; printf("max: %d\n", (*pfunc)(10, 20)); for(i=0; i<3; i++){ 
    printf("str[%d]: %s\n", i, *(parr+i)); } return 0; } 

运行结果:

max: 20 str[0]: http://www.baidu.com str[1]: 百度搜索引擎 str[2]: C-Language 

注意,typedef 是赋予现有类型一个新的名字,而不是创建新的类型。为了“见名知意”,请尽量使用含义明确的标识符,并且尽量大写。

typedef 和 #define 的区别

typedef 在表现上有时候类似于 #define,但它和宏替换之间存在一个关键性的区别。正确思考这个问题的方法就是把 typedef 看成一种彻底的“封装”类型,声明之后不能再往里面增加别的东西。

1 . 可以使用其他类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做。如下所示:

#define INTERGE int unsigned INTERGE n; //没问题 typedef int INTERGE; unsigned INTERGE n; //错误,不能在 INTERGE 前面添加 unsigned 

2 . 在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。例如:

#define PTR_INT int * PTR_INT p1, p2; 

经过宏替换以后,第二行变为:

int *p1, p2; 

这使得 p1、p2 成为不同的类型:p1 是指向 int 类型的指针,p2 是 int 类型。

相反,在下面的代码中:

typedef int * PTR_INT PTR_INT p1, p2; 

p1、p2 类型相同,它们都是指向 int 类型的指针。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202554.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:51
下一篇 2026年3月19日 下午11:52


相关推荐

  • C语言解读assert函数

    C语言解读assert函数assert 宏的原型定义在 assert h 中 其作用是如果它的条件返回错误 则终止程序执行 原型定义 include assert h voidassert intexpressio assert 的作用是现计算表达式 expression 如果其值为假 即为 0 那么它先向 stderr 打印一条出错信息 然后通过调用 abort 来终止程序运行 已放弃使用 assert 的缺点是 频繁的调用会极大的影响程序的性能 增加额外的开销 在调试结束后 可以 assert h assert h

    2026年3月17日
    2
  • 配置zabbix时启动失败解决办法

    配置zabbix时启动失败解决办法一开始按照这篇博客来配置zabbixhttps://blog.csdn.net/rujianxuezha/article/details/79842998启动zabbix时出现以下提示[root@www~]#systemctlstartzabbix-serverJobforzabbix-server.servicefailedbecauseaconfiguredresourc…

    2022年6月17日
    316
  • 文件系统挂载、ext文件系统及read命令、Linux RAID、lvm应用「建议收藏」

    文件系统挂载、ext文件系统及read命令、Linux RAID、lvm应用

    2022年4月2日
    44
  • Matlab griddata函数功能介绍

    Matlab griddata函数功能介绍转载▼标签: 杂谈 分类:matlab 功能数据格点格式(1)ZI=griddata(x,y,z,XI,YI)用二元函数z=f(x,y)的曲面拟合有不规则的数据向量x,y,z。griddata将返回曲面z在点(XI,YI)处的插值。曲面总是经过这些数据点(x,y,z)的。输入参量(XI,YI)通常是规则的格点(像用命令meshgrid生成的一样)。…

    2022年5月26日
    63
  • 转:Java中Scanner类和BufferReader类之间的区别

    转:Java中Scanner类和BufferReader类之间的区别

    2021年6月13日
    94
  • 网页 木马

    网页 木马木马程序检测 站长可以根据网页文件的修改时间来判断是否被植入木马 方法是察看所有被更改的文件的更改日期 由于是木马修改了这些页面 因此它们修改日期非常接近 然后查询此日期最近新建立的 asp aspx asa 文件 将异常文件进行隔离或删除 使用 PhpWind 论坛程序的站长还可以下载专用的网页木马检测工具来进行木马的检测和清除 nbsp 下载地址 http www phpwind com

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号