2019独角兽企业重金招聘Python工程师标准>>>

typedef可以看作type define的缩写,顾名思义就是类型定义,也就是说它只是给已有的类型重新定义了一个方便使用的别名,并没有产生新的数据类型。

typedef的使用与宏定义define有些许的相似,但两者又有以下不同:

1.与#define不同,typedef给出的符号名称仅限于对类型,而不是对值。

2.typedef的解释由编译器,而不是预处理器执行。

3.typedef比#define更灵活。

既然typedef没有定义新的数据类型,那么为什么还要使用它呢?使用typedef有其自身的优势:

1.它使得定义更加直观,从定义就可了解变量的某些信息。如

typedef unsigned int BYTE;

BYTE x, y[10], *z;

2.它可以使程序参数化,以提高程序的可移植性。如

time_t time(time_t *); 该函数返回的是time_t 类型的返回值,有些系统中 time_t 被定义为unsigned long类型,而另外一些系统中,可能被定义为unsigned int 类型,这样,在移植到不同的系统中时,只要改变typedef定义,就可以在不同的系统中进行移植了。

3.表达方式更加简洁。如

使用typedef命名一个结构体时,typedef struct{double x; double y;}rect; rect r1 = {3.0, 6.0};

如果不使用typedef则显得复杂,struct {double x; double y;}r1 = {3.0, 6.0};

使用typedef定义的作用域取决于typedef语句所在的位置,如果定义是在一个函数内部,它的作用域就是局部的,限定在那个函数里。如果定义是在函数外部,它将具有全局作用域。typedef中声明的类型在变量名的位置出现,而不是紧接在关键字typedef之后。typedef在语法上类似于存储类中的extern、static等,所以不能同时对一个变量类型使用typedef和static等。建立好数据类型名之后,可以使用它来进行类型声明、类型转换等。如:

typedef char *String;

String p, lineptr[MAXLINES], alloc(int); //类型声明

int strcmp(String, String);

p = (String)malloc(100); //类型转换

typedef的常用范例如下:

1.简单的定义变量的别名。

typedef char * PChar;

PChar a, b; //相当于char *a; char *b;

2.与结构体的结合使用。

typedef struct Node{

int a;

char *b;

}*PNode;

PNode a, b;

3.对复杂的变量定义一个类型别名。

下面是参考别的博客的内容:

typedef int (*PF) (const char *, const char *);这个声明引入了 PF 类型作为函数指针的同义字,该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。比如:

void (*signal (int signr,void (*handler)(int))) (int);可以通过两次typedef来进行定义。

typedef void sigfunc(int);

sigfunc *signal(int signr,sigfunc *handler);

其中typedef定义了一个有一个整型参数无返回值的函数类型。void (*handler)(int)表示一个有一个整型参数无返回值的函数指针,这个指针名为handler,所以其可以用sigfunc进行说明,此时sigfunc就相当于前面的int signr中int的作用;同理这个函数也是这样。

理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:
int (*func)(int *p);
首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。
int (*func[5])(int *);
func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。

转载于:https://my.oschina.net/ray1421/blog/683623

C语言之typedef详解相关推荐

  1. C语言再学习 -- 详解C++/C 面试题 2

    (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题. 参看:嵌入式程序员面试问题集锦 1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define ...

  2. C语言结构体详解(结构体定义,使用,结构体大小等)

    c语言结构体详解 1.c语言结构体 1.1 结构体基础知识 1.2 结构体声明 1.3 结构体特殊声明 1.4 结构体的自引用 1.5 结构体的大小的计算 1.5.1了解结构体大小计算规则 1.5.2 ...

  3. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  4. R语言基础知识详解及概括

    R语言基础知识详解及概括 目录 R语言基础知识详解及概括 R数据可视化示例 R语言进行数据创建

  5. c语言练习题及答案)(1),c语言练习题(带详解答案)1.pdf

    c语言练习题(带详解答案)1 (-2) -1: 一单项选择题 /为求商运算符,该运算符能够对整型.字符.浮点等类型的数 据进行运算,5/2 2 1.(A )是构成C语言程序的基本单位. 11.如果 i ...

  6. python语言的格式框架_django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...

  7. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

  8. c语言4 答案详解,2019考研数据结构C语言版详解答案(4)

    <数据结构(C语言版)>复习重点在二.三.六.七.九.十章,考试内容两大类:概念,算法,自从计算机专业课统考以后,专业课考试题型分为2类,一类选择题,一类综合应用题.本次新东方在线整理了数 ...

  9. 计算机科学类专升本复习之“C语言结构体”详解(初稿)

    C语言结构体详解,C语言struct用法详解 前面所学到的"数组":它是一组具有"相同类型"的数据的集合. 但是在实际的编程中,我们往往还需要 一组" ...

最新文章

  1. ASP.NET之父强烈推荐,无可争议的圣经级巨著
  2. 深度学习DL蒙特卡洛法平衡态分子动力学模拟并计算苯酚键值
  3. ABAP 在字符串之间加入若干空格
  4. 【运维囧事】运维的苦乐之旅
  5. IBM在欧洲启动“智能云”研发计划
  6. python ftp 设置代理_用Python搭建一个简单的代理池
  7. 基于PHP采集数据入库程序(二)
  8. python异步调用_python如何实现异步调用函数执行
  9. (转)关于BigDecimal 转化字符串toPlainString()和toString()的区别
  10. EIGRP DUAL算法
  11. Linq中查询List组合相同值数量大于1
  12. 干电池很不经用,比充电电池差多了
  13. java 使用itextpdf分割pdf文件,pdf分页
  14. java利用梦网云通讯发送短信
  15. Intel HD Graphics
  16. 如何用计算机排版打表格,PPT怎么利用表格来进行排版
  17. android 模拟器的使用
  18. go decimal 使用方法
  19. 一些情况及问题的说明
  20. 微信上线新功能 看到这个提醒一定要接听

热门文章

  1. HDOJ_ACM_折线分割平面
  2. 系统架构师学习笔记_第二章_连载
  3. Flask之扩展flask-migrate
  4. WPF 自定义标题栏 自定义菜单栏
  5. Bleve:来自Couchbase、基于Go语言的全文索引与检索库
  6. 分享Silverlight/WPF/Windows Phone一周学习导读(3月1日-3月5日)
  7. SAP提请法院向甲骨文支付不超4亿美元赔偿金
  8. 去年一个百万级的小软件项目经验分享,20来个功能模块,项目不太好做有些棘手...
  9. 支持者基于BCH提出众多新概念,推动BCH创新
  10. Cash Shuffle的BCH在稳步测试中前进