1.typedef
简单来说就是给类型取别名,你到公司工作会看到各种不同类型的数据类型,其实只是他们自己取的别名罢了。
unsigned long int a;
//1 不想让别人知道我的类型
//2 嫌这个名字太长了
//给类型取个别名
typedef unsigned long int NLINT;
typedef unsigned long int MHT_INT64;
typedef unsigned long int QF_INT64;
//NLINT MHT_INT64 QF_INT64 都是指向 unsigned long int的替代名字,作用一模一样。
2 函数指针
2.1 函数指针的定义
是一种指针变量,所以储存的是一个函数的地址,函数也是有地址的,函数产生之后储存在内存的代码区,内存分有:栈区,堆区,静态区,代码区。函数的地址就是函数名。
void fun()
{}
int main()
{
printf("%p",fun);//函数名就是地址
}
给函数指针取别名,使用typedef
void fun(int a){}
int main()
{
typedef void name(int a);
name *p=fun;//前面已经说过函数名就是地址,所以p是void (int a)类型的指针变量,保存fun(int a的地址)。
typedef void (*name)(int a);//name要加括号,不加括号就是函数指针数组了,里面储存的是多个函数的地址.
name q=fun;//q是一个void *(int a)的指针变量
}
2.2函数指针取值
void fun(int a){}
typedef void (*FUN)(int a );
//q为保存fun(int a)函数的地址,大家想想fun是函数地址,那么fun(10),就能调用函数了,同理q(10)也能调用函数。
FUN q=fun;
//注意
(*p)(20);//对函数指针取* 编译器认为还是函数的地址
(&fun)(10);//对函数名取&编译器认为还是函数的地址
(*fun)(10);//对函数名取*编译器认为还是函数的地址
(************fun)(10);//对函数名取*编译器认为还是函数的地址
2.3函数指针数组
如果你对指针有一定的了解你会知道 int (*p)[10]=a[10]代表数组指针,只有一个指向a[10]地址的指针,而 int *p[10]代表的是指针数组,这是一个数组,但是里面存放的是地址,而不是值。同理函数指针数据里面存放的是多个指针。
void fun(int a)
{}
typedef void (*FUN[4]) (int);
typedef void (*FUNa)(int a);
typedef void FUNab(int a);
FUN p={fun,fun,fun,fun};//可以存储多个函数地址;
FUNab *u[3]={fun,fun,fun};
FUNab u[3]={fun,fun,fun};
void (*ni[3])(int a)={fun,fun,fun};
以上几种表达方式都可以表示函数指针数组
3.回调函数
函数指针作为函数形参 -将这类函数称为 回调函数
int myadd(int a, int b)
{
return a + b;
}
void test(int( *p) (int ,int),int a, int b)
{
cout<<p(a,b)<<endl;
}
int main()
{
test(myadd,10,20);
}