typedef的几种用法:
1、为类型定义别名
例1:
typedef double DOUBLE; //DOUBLE是类型double的别名
DOUBEL d = 3.14; //等价于 double d = 3.14
例2:
typedef int Int; //定义类型int的别名是Int
typedef Int INT, *INT_PTR; //INT是Int的别名,INT_PTR是int*的别名
例3:
typedef stuct Student
{
int age;
string name;
}STUDENT; //给结构体Student取别名为STUDENT
STUDENT stu; //可以直接用STUDENT创建该结构体的一个实例stu
注意:define跟typedef很像,define做的是同名替换。例如:
#define INT int //int的别名是INT,只要代码中出现INT,可以直接用int将INT替换掉
INT i = 10; //等于int i = 10;
但是typedef却不同,例如:
typedef int* INTPTR; // 1
int x = 2; // 2
const INTPTR ps = &x; // 3
// 如果直接将3当成 const int* ps = &x; 是错误的。实际上ps是个常量指针
2、用typedef定义函数指针
例如:
typedef int (*PFUN)(int, int); //定义PFUN是一个函数指针,所指的函数具有两个int形参,返回类型为int的函数。
int fun(int a, int b)
{
return 0;
}
PFUN pfun = fun;
pfun(0, 0);
3、typedef的实质理解
以 int* p; 为例,可以看出变量p的类型是int*。如果在前面加一个typedef后,变成了tydedef int* p; ,由于typedef的修饰,标识符p被定义成类型int*的一个别名,也就是说typedef让普通变量p变成了p的类型的一个别名了,即int*的别名。
接下来列举几个例子进行分析:
例1:
typedef int* Iptr;
去掉typedef,得到正常变量声明 :int* Iptr; 变量Iptr的类型是int*;
而 typedef int* Iptr 中的Iptr是类型int*的一个别名。
从而:Iptr iptr; 中的iptr是一个int*类型的指针变量。
例2:
typedef int (*PFUN)(int, int);
去掉typedef ,得到正常变量声明: int (*PFUN)(int, int); 变量PFUN是一个函数指针,指向一个具有两个int形参,返回值为int的函数。
而typedef int (*PFUN)(int, int);中的PFUN是函数指针类型( int (*)(int,int) )的一个别名。
从而:int fun(int a, int b);
PFUN pfun = fun; pfun 是一个指向int (*)(int,int)的一个函数指针。
例3:
typedef int A[5];
去掉typedef ,得到正常变量声明: int A[5];变量A是一个含有5个int类型元素的数组。
而 typedef int A[5] 中的A是类型int[5]的一个别名。
从而:A a = {1, 2, 3, 4, 5}; 中的a的类型是int[5]。