typedef,用最简单的话去诠释他,那么就是给类型取别名!!!  但是他并没有你想象的那么简单! 举例: typedef int size;//那么int就有一个别名叫size了,以后就可以 size i 什么的了;

看到这里,如果你仅仅认为typedef不过如此,不就是把第一个参数(类型名),等同于第二个参数,这么简单。那你可能就会陷入困境。

比如看下面这个例子: typedef char Line[81]; 你能说Line[81]就是char的别名吗?这显然不对。它真正的含义是:此时Line类型即代表了具有81个元素的字符数组。 那么 Line t;就等同于char t[81];看到这里你晕了没?不好理解是不是?我们尝试把它放在一起看看。

typedef char Line[];    //typedef行
char t[]; //原型行
Line t; //应用行

同理:

typedef int size;   //typedef行
int i; //原型行
size i; //应用行

另一个函数指针的例子

typedef    int    (*fun_ptr)(int,int);   //typedef行
int (*fp)(int,int); //原型行
fun_ptr fp; //应用行

这3个例子都有几个共同点:

1、“typedef行”和 “原型行”,相比形式基本相同,“typedef行”仅仅多个typedef而已。就最后一个例子来说

它们的根本区别是,fun_ptr是类的别名,fp是该类的变量(用面对对象的话,就是类的实例)。

2、“原型行”和 “应用行”他们得到的结果就是一样的。就最后一个例子来说,就是都创建了一个类型为

int  (*)(int,int); 的函数指针tp。

总结: 看穿了上面两个共同点,想看穿,或者是用透typedef就并非难事了。 因为只要我们能写出原型行,就能直接写出typedef行,而应用的行的理解就等同于原型行的理解! 比如 int    (*fp)(int,int);     我想跟这个函数指针类型取一个别名。只要在前面加个typedef即可啊!

typedef    int    (*fun_ptr)(int,int);,只不过把fp换成你想要的别名fun_ptr就行了。

应用就更简单了:fun_ptr    fp;

理解也简单了fun_ptr  fp;  就等价于 int    (*fp)(int,int);

其实,理解的关键就是把typedef后面两个参数看成一个整体,一切就豁然开朗~~

——宋桓公

2015-01-03

技术讨论欢迎加群~~电子技术协会   362584474

增加一个有趣的实例,2015-10-27,来自朱老师大课堂——4.3.8.指针、数组与sizeof运算符

#define dpChar char*
typedef char* tpChar;
dpChar p1, p2;
tpChar p3, p4;

//注意下define和typedef的用法,他们的两个参数,从意义上说,顺序是反过来的~~

//其实也不存在反过来,因为typedef真正的理解方式是,去掉typedef就是原型本身!!!!

dpChar p1,  p2;//得到的效果其实是  char* p1; 和char  p2;   得到一个指针变量(char*)和一个char变量tpChar p3,  p4;//得到的效果是 char* p1; 和char* p2;        得到两个指针变量(char*)

  时隔几个月,再次见证了typedef的力量~~哈哈!

typedef你真的理解么?的更多相关文章

  1. 您真的理解了SQLSERVER的日志链了吗?

    您真的理解了SQLSERVER的日志链了吗? 先感谢宋沄剑给本人指点迷津,还有郭忠辉童鞋今天在QQ群里抛出的问题 这个问题跟宋沄剑讨论了三天,再次感谢宋沄剑 一直以来,SQLSERVER提供了一个非常 ...

  2. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

  3. 对于C#中的一些点滴你真的理解了吗?

    废话不多说看题目,看看我们自己真的理解了吗? 1.如下代码输出的结果是什么? public class A{ public virtual void Func(int  number=10) { Co ...

  4. Android菜鸟的成长笔记(4)——你真的理解了吗?

    原文:Android菜鸟的成长笔记(4)--你真的理解了吗? 在上一篇中我们查看了QQ的apk源文件中的布局结构,并仿照QQ完成了我们第一个应用的界面,详细请看<Android菜鸟的成长笔记&g ...

  5. 我想这次我真的理解了 JavaScript 的单线程机制

    今天面试的时候被问到一个问题,是关于 JS 异步的.当时我脑海中闪过了一个单线程的概念,但却没有把真正的原理阐述清楚.所以回来特意重新回顾了前面单线程和异步相关的一些知识点. 虽然之前学习的时候也接触 ...

  6. 你真的理解Java 注解吗?

    你真的理解Java 注解吗? 1.什么是注解? 官方解释: Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java ...

  7. Java随谈(六)## 我们真的理解 Java 里的整型吗?

    我们真的理解 Java 里的整型吗 整型是我们日常生活中最常用到的基础数据类型,看这篇文章之前,我想问: 我们真的像自己认为的那么理解 Java 内的整型吗? 也许看完本篇文章你就有自己的答案. C ...

  8. c语言typedef关键字的理解

    1.typedef的定义 很多人认为typedef 是定义新的数据类型,这可能与这个关键字有关.本来嘛,type 是数据类型的意思:def(ine)是定义的意思,合起来就是定义数据类型啦. 不过很遗憾 ...

  9. Java内存模型原理,你真的理解吗?

    [51CTO.com原创稿件]这篇文章主要介绍模型产生的问题背景,解决的问题,处理思路,相关实现规则,环环相扣,希望读者看完这篇文章后能对 Java 内存模型体系产生一个相对清晰的理解,知其然知其所以 ...

随机推荐

  1. Android--自定义控件---自动分页的GridView

    最近,根据项目需求,需要一个能够自动分页的导航,所以便自定义了一个自动分页的GridView. 思路:继承RelativeLayout,然后在里面放了一个viewpager和一个GridView... ...

  2. python appium笔记(一):appium android环境配置及示例

     (一) 简介 Appium是一个开源的自动化测试框架,可以用来测试基于iOS.Android和Firefox OS平台的原生和混合应用.该框架使用Selenium Webdriver,在执行测试时和 ...

  3. Python网络爬虫笔记(一):网页抓取方式和LXML示例

    (一)   三种网页抓取方法 1.    正则表达式: 模块使用C语言编写,速度快,但是很脆弱,可能网页更新后就不能用了. 2.    Beautiful Soup 模块使用Python编写,速度慢. ...

  4. 解决在IDEA 的Maven下 出现 Cannot access in offline mode 问题

    去掉maven前面的work offline模式

  5. .NET(C#)如何遍历Dictionary

    我们知道.NET中的Dictionary是键/值对的集合,使用起来也是比较方便,Dictionary也可以用KeyValuePair来迭代遍历,具体如下: using System; using Sy ...

  6. 破解 jar 包之直接修改 .class 文件方式

    一.常规 JAVA 软件破解流程 先讲一下常规jar包的破解流程. 1. 快速定位.          1) 通过procmon监控相关软件,查看程序都访问了些啥.         2) 用jd-gu ...

  7. centos7 安装 jdk1.8

    首先是Linux的不同版本的额系统自带的配置是不一样的,比如centos6上有的自带的jdk环境的话要装1.8的就要进行卸载或者马上进行更改 jdk是java程序依赖的环境 首先查看你的系统下是否有j ...

  8. Cisco ASA 使用ASDM 配置管理口 方法

    CISCO ASA防火墙ASDM安装和配置 准备一条串口线一边接台式机或笔记本一边接防火墙的CONSOLE 接口,通过CRT或者超级终端连接ASA在用ASDM图形管理界面之前须在串口下输入一些命令开启 ...

  9. rsync 故障排查整理

    Rsync服务常见问题汇总 ================================================================== 1 客户端的错误现象:No route ...

  10. fedora安装视频播放器

    添加RPMFusion仓库后才能安装VLC.Mplayer,其他库中没有 直接 sudo dnf install vlc sudo dnf install mplayer