1.typedef的常规用法

typedef unsigned int  UNIT;

UINT b;

需要注意的地方有下面几点:

①define 前面替代后面, typedef后面替代前面,这个不要记混了.

②typedef 后面有"分号",宏定义没有.

UINT是unsigned int类型的别名.

2.使用typedef简化复杂的定义

这是一个简单的函数指针的定义:
int (*pFun1)(int);    //在后面加上" = &fun"可以实现初始化, 其中&可有可无
假如再定义多个相同类型的函数指针,还可以:
int (*pFun2)(int);
int (*pFun3)(int);
...
那么这也太麻烦了,假如使用typedef,就可以:
typedef int (*pFun)(int);
pFun pFun1;
pFun pFun2, pFun3;
方便了很多!

使用typedef简化复杂的定义的本质,就是:

"用定义好的变量(pFun就是定义好的函数指针变量),代表变量的类型(函数指针类型),来定义相同类型的变量(pFun1,pFun2...)".

这里补充一下函数指针的调用方式:

我以为是: (*pFun1)(10);

其实直接使用: pFun1(10)也是可以的!

因为函数名和函数指针,在调用和赋值的时候是不加区分的,既然函数名可以赋值给函数指针,

调用的时候,一般使用函数名,那么我们使用函数指针应该也是可以调用的!

我们甚至可以无聊的定义函数: void fun(int a);

然后调用的时候把fun当成指针: (*fun)(19);

3.两种用法

我以前只知道第一种用法,看kernel代码的时候发现有很多定义看不懂.

比如出现了定义: pFun pfun1;

我会认为在C/C++中,自定义的类型只有结构体和类,所以pFun一定是结构体了.

但是根据使用方法,pfun1却是函数指针的用法?所以就会很懵逼.

现在明白了,原来可以通过typedef定义一种任何一种变量类型,包括基础变量类型无法直接定义的函数指针.

C语言中实现类似多态性的功能,很多都是通过函数指针来实现的,所以typedef简化复杂的函数指针定义在kernel中很常见!

这两种方法有什么区别?

回过头来看第一种用法,其本质何尝不是"用定义好的变量,代表变量的类型,来定义相同类型的变量"?

我们常见:

typedef unsigned int  UNIT;

UINT b;

好像就是给unsigned int取了一个别名.

其实这种写法一直以来都给我们一种误解,这不是无法体现typedef的本质.

假如我们写成:

typedef unsigned int  a;  

不看typedef,就是定义了一个变量a, typedef的作用,就是让变量a具有"代表变量类型去定义相同类型变量"的功能!

然后才有: a  b;

具体a定义的是什么类型,是由"假设没有typedef时, a作为变量时的类型"决定的.

这样一来,typedef的两种用法的本质都是一样的, 可以概括为一种用法.

typedef的最新理解的更多相关文章

  1. [math] 我对对数的最新理解

    前言 作为资深学渣,每次遇到对数就极度恐慌.恐慌不是因为要考试---.而是因为不理解,只能靠死记硬背运算规则.不能进行有效的推理,这让我极度不爽,因为会忘记.故惶恐. 所以总是耿耿于怀,想要试图理解对 ...

  2. typedef你真的理解么?

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

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

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

  4. 对try-catch-finally异常处理的最新理解

    try{ ...... }catch(......){ }finally{ ...... } 这个结构是用来处理Java所有可能出现的异常的,这个我很早其实就已经学过,不过最近看了个视频,感觉自己虽然 ...

  5. Manifest文件的最新理解

    今天看了Manifest文件内容的相关视频,感觉对知识的理解深刻了一些: 首先,先来说说这个文件的作用,这个文件可以说是聚集了很多个标签,其实对于每个主标签,在将来编译的时候,都会被处理成一个类,而标 ...

  6. 关于Unity物理事件的执行顺序的最新理解

    物体A: public class A:{ B b; void FixedUpdate(){ if(input.GetKeyDow(Keycode.I)) { collider.enable=fals ...

  7. signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解

    把void (*signal(int signum,void(*handler)(int)))(int)分成两部分: typedef void (*sighandler_t)(int); sighan ...

  8. Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...

  9. typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void)

    1.typedef  int (init_fnc_t) (void);表示定义init_fnc_t为函数类型,该函数返回int型,无参数.而“init_fnc_t  *init_sequence[]= ...

  10. typedef void (*sighandler_t)(int);

    typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); ---------- ...

随机推荐

  1. 进程相互作用之信号量PV操作及其代码实现

    目录 信号量PV操作 基本介绍 数据结构 解决进程互斥问题 解决进程同步问题 代码实现(以同步问题为例) 信号量PV操作 基本介绍 信号量(Semaphore):是表示资源的实体,是一个与队列有关的整 ...

  2. 2-6 C/C++ 编写头文件

    目录 头文件怎么起作用 避免头文件被重复引用 避免头文件被重复引用的方法:条件编译 1. 给每个头文件添加一个预编译变量(preprocessor variable)作为标记(Label) 2. 使用 ...

  3. Redis示例配置文件

    # 注意单位问题:当需要设置内存大小的时候,可以使用类似1k.5GB.4M这样的常见格式: # # 1k => 1000 bytes # 1m => # 1kb => 1024 by ...

  4. 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现九

    一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...

  5. 题解:CF685A Robbers' watch

    题解:CF685A Robbers' watch 感觉这题难点主要在理解题意. 题意 一天 \(n\) 个小时,一小时 \(m\) 分钟,手表用 \(7\) 进制表示时间(位数未填满补前导零),求问这 ...

  6. Failed to load resoure:the serve responded with a status of 405 (Method Not Allowed)

    在项目中 web.config 引入 iis 删除WEBDEV 配置结束后 重启服务器

  7. 如果一个接口不使用token鉴权,应该怎么保持在登录状态下进行测试?

    1.token是接口中用于身份验证和授权的令牌,用户通过登录操作,服务器会返回一个token,这个token会在后续的请求中发送到服务器,用来证明用户的身份和权限. 2.如果接口没有token,可以使 ...

  8. Python脚本消费多个Kafka topic

    在Python中消费多个Kafka topic,可以使用kafka-python库,这是一个流行的Kafka客户端库.以下是一个详细的代码示例,展示如何创建一个Kafka消费者,并同时消费多个Kafk ...

  9. ArcGIS遥感影像重采样操作及不同算法对比

      本文介绍在ArcMap软件中,实现栅格图像重采样的具体操作,以及不同重采样方法的选择依据.   在之前的博客中,我们介绍了基于Python中Arcpy模块对栅格图像加以批量重采样的方法:而在Arc ...

  10. Servlet 3.0 新特性详解(servlet是单实例多线程的,线程池数量有限)

    Servlet 是 Java EE 规范体系的重要组成部分,也是 Java 开发人员必须具备的基础技能,Servlet 3.0 是 Servlet 规范的最新版本.本文主要介绍了 Servlet 3. ...