再谈typedef(重点为函数指针)
http://zjf30366.blog.163.com/blog/static/411164582009817101543293/
typedef是什么,怎么用
表面上typedef是给某一类型起别名,例如:
typedef int* p; p pointer;
实际上,在C99标准中是这样诠释的:"In a declaration whose storage-class specifier is typedef, each declarator defines an identifier to be a typedef name that denotes the type specified for the identifier in the way described in xx"
参照这段描述,并拿typedef int *p作为例子来理解:在一个声明中,如果有存储类说明符typedef的修饰,标识符p将被定义为了一个typedef name,这个typedef name表示(denotes)一个类型,什么类型呢?就是int *p这个声明(declarator)中标识符(indentifier)p的类型(int*)。
下面举例说明:
例1:
typedef double MYDOUBLE;
MYDOUBLE a;
去掉typedef,上面的语句是声明一个double类型的变量MYDOUBLE。加上typedef,MYDOUBLE这个标识符被定义为一个typedef-name,即去掉typedef所声明变量MYDOUBLE的类型,也就是double。
例2:
typedef int* Func(int);
Func *fptr;
去掉typedef,上面的语句声明一个函数名(标识符)为Func,返回值是指向int类型的指针,参数是int类型的函数。所以原语句会把Func定义为一个typedef-name,它表示的类型是返回值为int指针,参数是int的函数。
例3:
typedef int (*PFunc)(int); PFunc fptr;
去掉typedef,上面的语句声明一个函数指针PFunc,该函数指针指向一个返回值和参数都是int的函数。所以原语句把PFunc这个标识符定义为一个typedef-name,它用来声明返回值和参数都是int的函数的函数指针。
函数指针
https://blog.csdn.net/zj1131190425/article/details/92065897
获取函数指针:
函数的地址就是函数名,传递函数名即可。
声明函数指针:
声明指针时,必须指定指针指向的数据类型。对于指向函数的指针,要指定函数类型(返回值类型和函数的参数列表)。
double cal(int); // prototype double (*pf)(int); // 指针pf指向的函数, 输入参数为int,返回值为double pf = cal; // 指针赋值
使用指针调用函数
double y = cal(5); // 通过函数调用 double y = (*pf)(5); // 通过指针调用 推荐的写法 double y = pf(5); // 这样也对, 但是不推荐这样写
将函数指针作为函数的参数传递
void estimate(int lines, double (*pf)(int)); // 函数指针作为参数传递