先看一个例子
void print(int n)
{
printf("%d",n);
}
int main()
{
typedef int I;
//为int类型声明一个新名字I
I a = 5;//相当于int a = 5;
/* 如果上面的typedef去掉,int I就是一个普通的变量声明,声明一个int
* 型的变量I;下面同理:
* void (*fun) (int)只是声明一个函数指针fun;
* 加上typedef,相当于为指向void f(int)这种形式的函数的函数指针
* 声明了一个新名字:fun
* fun s;也就相当于void(*s) (int);
*/
typedef void(*fun) (int);
fun s;
s = print;
s(5);
/* 看typedef的含义,要不妨可以尝试先去掉typedef看看
* int x[10];声明一个数组x,数组有十个int型元素
* 加上typedef,可以看作把x上升为一种类型,x i相当于int i[10];
*/
typedef int x[10];
return 0;
}
上述代码输出:5
define和typedef的区别
首先,可以用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。如下所示:
define peach int
unsigned peach i; //这里没有问题,编译通过
typedef int banana;
unsigned banana i; //错误,不能这样做
其次,在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而用#define 定义的类型无法保证.如下所示:
define peach int*
peach apple,banana;
经过宏扩展,第二行变为:
int* apple,banana;
这使得apple和banana成为不同的类型,apple是一个指向int的指针,而banana则是一个int。
相反,在下面的代码中:
typedef char* peach
peach apple,banana;
apple和banana的类型依然相同。虽然前面的类型名变了,但他们的类型相同,都是指向char的指针。
类型别名中要注意的是 typedef int p;p为int的别名。而const p不是const int , p的基本数据类型是指针,所以const p是表示指针本身是const,即int const 。