除了可以直接使用C提供的标准类型名和自己声明的结构体、共用体、指针等类型外,还可以用typedef声明新的类型名来代替已有的类型名。我们还是从一个面试题来分析typedef的用法:
写出下面代码的输出内容:
#include <stdio.h>
int inc(int a)
{ return(++a); }
int multi(int*a,int*b,int*c)
{ return(*c=*a**b); }
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int*,int*,int*);
void show(FUNC2 fun,int arg1, int*arg2)
{
<span style="white-space:pre"> </span>FUNC1 p=&inc;
<span style="white-space:pre"> </span>int temp =p(arg1);
<span style="white-space:pre"> </span>fun(&temp,&arg1, arg2);
<span style="white-space:pre"> </span>printf("%dn",*arg2);
}
main()
{
int a; //局部变量a为0;
show(multi,10,&a);
return 0;
}
我们先不对例题进行分析,我们先来说明下具体的使用:
typedef struct
{
int month;
int day;
int year;
}DATE;
声明了一个新的类型名DATE,它代表上面指定的一个结构体类型。这时就可以用DATE来定义变量:
DATE birthday;
DATE *p;
可以不可以更复杂一点呢?
(1)
typedef int NUM[100]; //声明NUM为整型数组类型
NUM n; //定义n为整型数组变量
(2)
typedef char *STRING; //声明STRING为字符指针类型
STRING p,s[10]; //p为字符指针变量,s为指针数组
(3)
typedef int (*POINTER)();//声明POINTER为指向函数的指针类型,该函数返回整型值
POINTER p1,p2; //p1,p2为POINTER类型的指针变量
#define是在预编译时处理的,它只能做简单的字符串替换,而typedef是在编译时处理的。实际上并不是做简单的字符串替换。而是用“类型声明一个类型”,就是采用定义变量的方法那样来声明一个类型。
利用上面的所有知识来分析开头的源代码:
#include <stdio.h>
int inc(int a)
{ return(++a); }
int multi(int*a,int*b,int*c)
{ return(*c=*a**b); }
typedef int(FUNC1)(int in); //声明FUNC1为一个函数类型
typedef int(FUNC2) (int*,int*,int*); //声明FUNC2为一个函数类型
void show(FUNC2 fun,int arg1, int*arg2) // 传递函数的时候,把multi传递给了fun
{
FUNC1 p=&inc;
int temp =p(arg1);
fun(&temp,&arg1, arg2);
printf("%dn",*arg2);
}
main()
{
int a; //局部变量a为0;
show(multi,10,&a);
return 0;
}
所以结果是:110