关于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是一个函数指针变量
原文地址:https://www.cnblogs.com/dylan2011/p/2689162.html