zoukankan      html  css  js  c++  java
  • 关于typedef的悲剧的学习

          关于typedef的使用,我们的教科书,真神奇,竞然只给出了一个很模棱两可的定义与几个简单使用的例子,先不感叹作者的负责与不负责,至少这样的教科书会对我们造成很多的困扰,最近在使用typedef时,想仔细看个究竟,国内的网络真是太强大了,千篇一律的转载,没一个能看懂的,难道我的理解力有问题?基础的用法都说得清楚,因为教材上也是这样说的,至于更深层次的,似乎都是遮遮掩掩,没几个说清楚的,包括某著名搜索引擎,其实找来找去原来都是从那转载过去的,可见国内网络上的有些东西是很不负责任的,作者纯粹为发博客而博客。因此,很多初学者对其的理解仅仅局限于:typedef主要用来定义一个已有类型的“别名(alias)”。正因如此,才有了对typedef int myint和typedef myint int之间的犹豫不决。

          教材上的那千篇一律的介绍,本文就不再谈论了,下面主要就教材上没有说得太清楚的地方介绍一下:

          首先结合C99标准中关于typedef的说明:

          In a declaration whose storage-class specifier is typedef , each declarator defines an indentifier to be a typedef name that denotes the type specified for the identifier in the way described in xx

          在一个声明中,如果有存储类型说明符typedef,标识符被定义为一个typedef name,这个typedef name表示一个声明中标识符(identifier)的类型。

    于是对比:

    1 int * pointer;
    2 
    3 typedef int * pointer;

    int * pointer中,pointer是一个变量,它的类型就是:int指针型,而在前面加typedef后,pointer立即变为一个typedef-name,其所表示的类型就是int指针型(int *)。 于是pointer就由一int指针型变量变成了,pointer类型了(typedef-name)。

    于是,很多教材上没有用法就出现了:

    1.数组类型的定义

    例如:    typedef int array[2];
    描述:    int array[2],声明一个含两个元素的int数组,由于array是指针,
           所以这里typedef的是将int指针型,定义为array,只不过这里的指针型具有数组的属性而已。
           因此,array等价于 int [2]定义;  array a声明等价于int a[2]声明。 扩展: typedef int array[M][N]; 描述: array等价于 int [M][N]定义;同上 array a声明等价于int a[M][N]声明

    2.指针类型定义

    例如:  typedef int *pointer;
    描述:  pointer等价于 int *定义;
          pointer p声明等价于int *a声明
    
    例如:  typedef int *pointer[M];
    描述:  pointer等价于 int *[M]定义;
          pointer p声明等价于int *a[M]声明明
    

     3.函数声明

    例如:   typedef int func(void);  
            func等价于 int (void)类型函数,func实际上是指向函数首地址的指针,所以这里typedef的还是int指针型
    描述1:  func f声明等价于 int f(void)声明,用于文件的函数声明
    描述2:  func *pf声明等价于 int (*pf)(void)声明,用于函数指针的生命,见下一条
    

     4.函数指针

    例如:   typedef int (*func)(void)
    描述:   这里还是typedef的一个指针型,不过该指针型不再是int指针型,而是一个函数指针型,因此这里相当于将func typedef为一函数指针型
            func等价于int (*)(void)类型 func pf等价于int (*pf)(void)声明,pf是一个函数指针变量
  • 相关阅读:
    logback 打印mybatis sql mybatis 日志打印sql语句和返回结果
    SpringBoot使用logback输出日志并打印sql信息 --经典---
    Logback设置SQL参数打印
    springboot2.X整合mybatis
    异常解决:java.lang.IllegalStateException: Failed to introspect Class
    springboot 启动报错 java.lang.IllegalStateException: Failed to introspect annotated methods on class org
    数据库相关中间件介绍
    QWaitCondition 的正确使用方法(通过 mutex 把有严格时序要求的代码保护起来,同时把 wakeAll() 也用同一个 mutex 保护起来)
    对生产者和消费者问题的另一个解决办法是使用QWaitCondition(封装好了wakeOne,wakeAll,而且与QReadWriteLock对接,几乎是万能的办法)
    Linux定时器的使用(三种方法)
  • 原文地址:https://www.cnblogs.com/dylan2011/p/2689162.html
Copyright © 2011-2022 走看看