typedef你真的理解么?
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你真的理解么?的更多相关文章
- 您真的理解了SQLSERVER的日志链了吗?
您真的理解了SQLSERVER的日志链了吗? 先感谢宋沄剑给本人指点迷津,还有郭忠辉童鞋今天在QQ群里抛出的问题 这个问题跟宋沄剑讨论了三天,再次感谢宋沄剑 一直以来,SQLSERVER提供了一个非常 ...
- 【转】你真的理解Python中MRO算法吗?
你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...
- 对于C#中的一些点滴你真的理解了吗?
废话不多说看题目,看看我们自己真的理解了吗? 1.如下代码输出的结果是什么? public class A{ public virtual void Func(int number=10) { Co ...
- Android菜鸟的成长笔记(4)——你真的理解了吗?
原文:Android菜鸟的成长笔记(4)--你真的理解了吗? 在上一篇中我们查看了QQ的apk源文件中的布局结构,并仿照QQ完成了我们第一个应用的界面,详细请看<Android菜鸟的成长笔记&g ...
- 我想这次我真的理解了 JavaScript 的单线程机制
今天面试的时候被问到一个问题,是关于 JS 异步的.当时我脑海中闪过了一个单线程的概念,但却没有把真正的原理阐述清楚.所以回来特意重新回顾了前面单线程和异步相关的一些知识点. 虽然之前学习的时候也接触 ...
- 你真的理解Java 注解吗?
你真的理解Java 注解吗? 1.什么是注解? 官方解释: Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java ...
- Java随谈(六)## 我们真的理解 Java 里的整型吗?
我们真的理解 Java 里的整型吗 整型是我们日常生活中最常用到的基础数据类型,看这篇文章之前,我想问: 我们真的像自己认为的那么理解 Java 内的整型吗? 也许看完本篇文章你就有自己的答案. C ...
- c语言typedef关键字的理解
1.typedef的定义 很多人认为typedef 是定义新的数据类型,这可能与这个关键字有关.本来嘛,type 是数据类型的意思:def(ine)是定义的意思,合起来就是定义数据类型啦. 不过很遗憾 ...
- Java内存模型原理,你真的理解吗?
[51CTO.com原创稿件]这篇文章主要介绍模型产生的问题背景,解决的问题,处理思路,相关实现规则,环环相扣,希望读者看完这篇文章后能对 Java 内存模型体系产生一个相对清晰的理解,知其然知其所以 ...
随机推荐
- Expo大作战(二十四)--expo sdk api之Accelerometer
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- [Sublime-Text] Linux下用Sublime-Text3编译输出Java文件
因为现在在借着经典的书籍巩固一些基础知识,所以会经常跑一些简单的程序,可又不想开庞大的IDE.所以就想试着用Sublime-Text来编译程序,哦,当然如果习惯的话,用 terminal 也可以.其实 ...
- 2018-9 Java.lang.StackOverflowError
问题: Java.lang.StackOverflowError at com.**Logger.**.**.StringFilter.isValueNull(StringFilter.java:81 ...
- JAVAEE——SSH项目实战01:SVN介绍、eclipse插件安装和使用方法
1 学习目标 1.掌握svn服务端.svn客户端.svn eclipse插件安装方法 2.掌握svn的基本使用方法 2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...
- jquery插件导出excel和pdf(解决中文乱码问题)
参考文件:http://jackyrong.iteye.com/blog/2169683 https://my.oschina.net/aruan/blog/418980 https://segmen ...
- 总结获取原生JS(javascript)的父节点、子节点、兄弟节点
关于原生JS获取节点,一直是个头疼的问题,而且调用方法的名字又贼长了,所以我选择用JQ,好像跑题了-- 话不多说看代码 获取父节点 及 父节点下所有子节点(兄弟节点) <ul> <l ...
- C# System.IO.Path
Path的常用方法 函数列表 对一个路径做相应操作,包括文件路径,目录路径,通常会用到Path这个类, 本文列举一些常用的操作. 获取指定路径字符串的目录信息 public static string ...
- [IDEA_2] IDEA 问题合集
1. IDEA 通过 Maven 导入的依赖包下面存在红色波浪线 问题描述: 创建的 Maven Project 在添加相关依赖后自动下载,自动添加的依赖包的下面存在红色波浪线,在使用过程中存在问题, ...
- MySQL基础之 视图
视图 视图就是从一个表或多个表导出来的一张虚拟的表.通过这个窗口可以看到系统专门提供的数据,方便用户操作的同时增加了安全性. 视图的特点: 1.视图的列可以来自于不同的表. 2.视图是由实际存在的表创 ...
- cJSON 使用详解
由于c语言中,没有直接的字典,字符串数组等数据结构,所以要借助结构体定义,处理json.如果有对应的数据结构就方便一些, 如python中用json.loads(json)就把json字符串转变为内建 ...