typedef是干嘛的
typedef是用来定义新类型的
这里的新有两个意思:
1、旧类型改成新的名字
比如:typedef INT int; 是说程序中应该使用int的地方统一使用INT了.这么做是不是有些脱裤子放屁了???其实不是.这种做法在移植上很常见.有些系统上的int长度不一样.比如有的系统上int是16位长度的,使用int_16表示.这个时候只需要写成typedef INT int_16; 那么程序中INT的类型都会换成int_16这个符合新系统的类型了. 这里有些时候也可以使用#define
来替换.
举个例子:
int *p;
上面这句话大家都知道是定义了一个int*类型的指针变量p
现在问你一个问题,p是个变量,那么p的类型是什么?
你一看,这不是废话么.p的类型当然是int *类型的了.说成人话就是,p的类型是`整型的指针类型`.
(这句话里有个整型,这个型是和整在一起的,整型是一个词,表示这个位置应该是个数字,所以可以这么说,p的类型是数字的指针类型,p的内容是个地址,这个地址上只能存数字,还是个整数数字).
现在明白了p的类型了,我们再来看看下面这句话.
typedef int *p;
这句话是使用了typedef来将int *类型使用了一个标识符p来进行代替.这个式子里就一个p不是关键字.
经过这句话后,就是给int *起了一个别名叫p
所以以后声明新的整型指针变量的时候可以直接使用p来进行声明了.
比如: p a; 这句话就和 int * a;是一样的.
我们怎么理解p是int *的类型?
首先看int *p;
这个p是int *类型的,然后再前面加上了typedef后,p就表示这个类型了.这个弯要转过来哦.
2、定义一个新的类型
这个就是大家很疑惑的地方了。什么叫新类型?不是我们常见的基本类型。比如函数指针类型
的变量,指针数组类型
的变量.
直接上例子
int add(int a, int b);首先定义了一个求和函数.
int (*func)(int, int);这句话是声明了一个函数指针(不明白的去看一下我的其他博文).
这句话写出来之后,就是和 int x;没有区别,就是声明了一个变量.
int (*func)(int, int);声明了一个指针变量叫func,由于它是一个函数指针,所以它应该有所指向,并且应该指向一个函数.它指向了一个返回值是int,形参是(int,int)的这样的函数(也就是指向了add那样的函数).
既然是这样的函数(这样的函数是个什么样的函数?返回值是int,形参是(int,int)的函数),我们是不是可以给这样的函数起个名字啊?
当然可以啊.
那我们是不是也可以把这样的函数叫做这个类型的函数啊?
当然可以啊.
好,那我们来起名字.
typedef int (*this_type)(int, int);
这样就给这样的函数起了个名字叫`this_type`.
以后我们就可以使用this_type来声明一个函数指针了.
this_type mins_func;//声明了一个叫做mins_func的函数指针,mins_func指向 `返回值是int,形参是(int,int)的函数`
举个完整例子(这个例子,我自己实际运行过的,输出ok)
#include <stdio.h>
//我们定义一个求差的函数
int mins(int a, int b);//这句是声明
//下面这个是具体实现
int mins(int a, int b){
return a-b;
}
typedef int (*this_type)(int, int);
//现在我们写一个main函数
int main(){
int cha = 0;
this_type mins_func; //声明函数指针
mins_func = mins; //给函数指针赋值
cha = mins_func(3, 4); //调用函数指针指向的函数
printf("3 - 4 = %d\n", cha);
return 0;
}
3、总结
该怎么使用typedef来定义新的类型???
首先写出需要定义的变量(某个标识符比如p,比如func),一般都是如何定义的,比如函数指针,数组指针
然后在前面加上typedef
最后你写的那个p,那个func就是新类型的名字了.
就是那个typedef的功能,它就是把之前的声明出来的变量名转换成了新的类型名.