问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

typedef在c语言的用法

发布网友 发布时间:2023-04-11 16:21

我来回答

1个回答

热心网友 时间:2023-09-25 16:03

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],这一点已在VIP教程《数组和指针绝不等价,数组是另外一种类型》中讲解过。

又如,为结构体类型定义别名:
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 <stdio.h>
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://c.biancheng.net",
"C语言中文网",
"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://c.biancheng.net
str[1]: C语言中文网
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
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
高考为什么不能补报志愿? 帮我翻译一句话“不管多久以后,不管世界变成什么样子,我都是哪个最骄傲... 温州到周口的大巴车经过台州路桥客运中心那里吗? 微信怎么设置看不到微信号 不想让微信号显示出来怎么办 2021年大学教师资格证报名费用 大埔教师资格证报名网 大埔县教育局办教师资格证需要准备哪些资料? 深情触摸2016百度云链接 求深情触摸百度云分享 笔记本开机后会自动关机? 梦见孩子被长辈打 梦见死去外婆家,打孩子,女儿和我打架 梦见死去外婆家,打孩子,女儿和我打架啥意思 Oracle11g数据库的认证体系结构 不工作,是不是很容易失眠? 一直在家不出门一天也没有什么活做每天有点轻微失眠怎么回事 猪脚鹿茸茹可以加花生黄豆玉米煮汤吗 联想g50笔记本配置? 联想电脑用比尔盖茨的芯片吗 联想小新air14的显卡芯片厂家是谁的 维特丝一次性补色口红式染色笔棒膏女遮盖白发补染植物天然黑色棕 碧丽妃是什么牌子 碧丽妃染发膏怎么样 梦见脚被铁片钉上的预兆 梦见别人送我铁片 梦见铁片穿脚 梦见左胳膊被铁片划伤 草莓怎么消毒冠状病毒 联想工控机怎么样 会计专业自我鉴定300字【12篇】 壹智安监控摄像头怎么样 为什么魔芋丝是白色的魔芋块是黑色的 魔芋为什么不能直接吃 帝道独尊老大哥真实身份 看见和显现有什么区别 拼多多上车图怎么上传的? 如何购买金镯子不吃亏? 如何选购黄金手镯? 初中初二上册物理教案:测量平均速度 用iis发布的发布的网站,本机可以访问,局域网其他电脑不能访问。 外网无法访问IIS虚拟目录 v8胶原蛋白复合肽作用和功效 2021儿童谜语大全3到6岁动物 学历不高最吃香的几个职业 请给一个能用的Adobe Acrobat 9的序列号~无效序列号:1118 1905 0841 9679 7056 1416。谢谢! 想要Adobe FrameMaker 9的序列号还有指教一下如何打开pdf文件 手机版pscc2019可以在电脑上使用吗 在进行素描的时候,握笔是否正确是很重要的,你的握笔姿势对吗? 三星钱包绑定门禁卡怎么解锁密码 纳奇门禁密码忘记了怎么办 苹果门禁卡加密怎么解除