typedef的作用

用途一:
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,
// 和一个字符变量;
以下则可行:
typedef char* PCHAR; // 一般用大写
PCHAR pa, pb;        // 可行,同时声明了两个指向字符变量的指针
虽然:
char *pa, *pb;
也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。

用途二:typedef struct tagPOINT
{
    int x;
    int y;
}POINT;

POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候

用途三:
用typedef来定义与平台无关的类型。
比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
在连 double 都不支持的平台三上,改为:
typedef float REAL;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如size_t。
另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。

用途四:
为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例:

1. 原声明:int *(*a[5])(int, char*);
变量名为a,直接用一个新别名pFun替换a就可以了:
typedef int *(*pFun)(int, char*);
原声明的最简化版:
pFun a[5];

2. 原声明:void (*b[10]) (void (*)());
变量名为b,先替换右边部分括号里的,pFunParam为别名一:
typedef void (*pFunParam)();
再替换左边的变量b,pFunx为别名二:
typedef void (*pFunx)(pFunParam);
原声明的最简化版:
pFunx b[10];

3. 原声明:doube(*)() (*e)[9];
变量名为e,先替换左边部分,pFuny为别名一:
typedef double(*pFuny)();
再替换右边的变量e,pFunParamy为别名二
typedef pFuny (*pFunParamy)[9];
原声明的最简化版:
pFunParamy e;

理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:
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。

也可以记住2个模式:
type (*)(....)函数指针
type (*)[]数组指针

转载于:https://blog.51cto.com/peacefulmind/1141506

typedef的作用相关推荐

  1. C++ typedef typename 作用

    C typedef typename 作用 vectorsize_type 为什么使用typename关键字 总结 C++ typedef typename 作用 C++的一些语法让人看着费解,其中就 ...

  2. typedef的作用和用法(给结构体,函数指针,数组取别名)

    typedef的作用和用法 作用(typedef 能给int,double,float,char等数据类型取别名) typedef 还能给结构体取别名 typedef 还能给函数指针取别名 typed ...

  3. rb c语言,C语言,RB和RBT什么区别啊???这里的typedef 什么作用???

    满意答案 guiyalm4704 2017.01.10 采纳率:58%    等级:12 已帮助:5026人 1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是 ...

  4. 对typedef void (*sighandler_t)(int)的理解(声明了一种类型:sighandler_t)

    typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 此处由于加了type ...

  5. C语言typedef和Windows数据类型

    typedef 的作用是给已知的数据类型命名别名,起到下列作用: 1 复杂的数据类型名称简化 2 用typedef 定义与平台无关的数据类型 3 增强代码可读性 4 避免错误 一个使用typedef的 ...

  6. 《C++ Primer 第五版》第二章(第5小节)——using和typedef,auto和decltype总结

    1.using和typedef(作用:定义类型别名) 1)typedef和using都可以用来定义一个类型别名,二者在类型别名上定义没有区别.只是需要注意的是类型和类型别名的顺序,使用typedef定 ...

  7. Mohican_4/22 结构体 typedef 枚举 联合 位段 内存对齐

    一.结构体 struct Test {int a;int b;int c; }; 关键字 struct  ,表示其是一个结构体,后面是一个可选的标记(Test) strcut Test Code st ...

  8. 数据结构中的问题与typedef

      版权声明:本文参考了严蔚敏的< 数据结构>.未经作者允许,严禁用于商业出版,否则追究法律责任.网络转载请注明出处,这是对原创者的起码的尊重!!! 1 typedef的作用 typede ...

  9. 使用typedef语句定义函数类型和函数指针

    首先我们要先明白一个概念,函数名是不是指针?也就是说一个函数名可不可以代表一个地址?以及什么是函数类型? 经过查找,函数名就是一个指针,但是意义是不一样的,如同于数组a[],a和&a其实都是一 ...

最新文章

  1. 浅谈Javascript事件模拟
  2. angular 定义对象_angular – 使用对象定义定义FomGroup
  3. 关于Map迭代循环,key和value的顺序问题
  4. 某linux主机的/etc/rc.d/rc.inet1文件中有如下语句,请修正错误,并解释其内容。
  5. javascript解析json格式的字符串,拼接后显示到表格中
  6. 设计模式系列--Strategy
  7. spark on yarn 部署问题
  8. 以下题目需要当场编写实现,,答案自己写
  9. 我的世界服务器怎么修复锁链甲,我的世界手机版锁链甲怎么做 怎么获得
  10. 关于设置安卓屏幕的显示方向
  11. 003《区块链开发指南》一一1.2 区块和区块链 转
  12. Nodejs ---- 升级到指定版本
  13. python常用的颜色英文表达_python常用颜色
  14. playsound报错
  15. 【每日一题】(D0723)strcpy 智能指针
  16. VvvebJs可视化前端设计开发工具
  17. 谁有好的反P2p终结者的软件啊!
  18. android电视+dlna,如何开启电视dlna功能(最简单最实用的多屏互动)
  19. 南卫理公会大学计算机科学,南卫理公会大学计算机科学与工程硕士.pdf
  20. 区块链防守铁娘子和她的安全军团

热门文章

  1. php当前日期的时间戳,php – 获取当前的ISO8601日期/时间戳
  2. java csv格式文件写入_java csv文件写入
  3. Jenkins Pipeline构建流水线发布
  4. 本地Windows 7/8上搭建IIS服务器
  5. datax底层原理_手把手实现Datax3.0中的传输通道
  6. java webservice接口开发_php开发webservice服务端接口(wsdl)
  7. java 写日志太快_Log4j2 快速入门 —— 定期/定大小生成日志文件(三)
  8. 教程:10、VI编辑器
  9. python输入列表方法_Python用input输入列表的方法
  10. ueditor html显示图片,百度ueditor编辑器上传图片后img标签的title、alt属性优化简单方法...