zoukankan      html  css  js  c++  java
  • typedef的最新理解

    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的两种用法的本质都是一样的, 可以概括为一种用法.

  • 相关阅读:
    『题解』POJ1753 Flip Game
    『数论』乘法逆元
    『数据结构』RMQ问题
    UVA 253 Cube painting 【数学】
    POJ 1852 Ants 【水+Trick+贪心】
    POJ 2955 Brackets 【区间DP】
    LOJ 1422 Halloween Costumes【区间DP】
    HDU 4193 Non-negative Partial Sums 【单调队列】
    CodeForces-545C Woodcutters 【贪心+机智】
    CodeForces 19D A and B and Interesting Substrings 【前缀和】
  • 原文地址:https://www.cnblogs.com/Younger-Zhang/p/10563115.html
Copyright © 2011-2022 走看看