分类: C/C 技术存档 |
- 函数指针
- 指针函数
void (*b[10]) (void (*)());
首先,表达式的后半部分被两个()分隔开了,我们分别分析它们。( *b[10] ),其中出现了变量名b,很容易就知道,b是一个有10个元素的数组,每个元素都是一个指针。
然后,看(void(*)()),其中没有出现变量名,所以它代表了一个类型,即“指向返回值为void型的函数的指针“,而我们知道,C语法中,类型修饰符是必须出现在变量名的左边的,而在整个表达式中这个类型符是在变量名b的右边,所以, (void(*)())最外层的这个(),表示了定义了一个函数,这个函数有一个参数,就是一个指针,具体来说,就是“指向返回值为void型的函数的指针“。
这样就很清楚了,b数组里,每一个指针元素,都是一个函数指针,这个函数有一个参数,这个参数是一个函数指针。整个表达式最左边的void,则定义了b数组中函数指针所指向函数的返回值类型。
在面对void (*b[10]) (void (*)());时,我们可以先声明后半部分的类型:
typdef void (*pFunParam)();
即表示,类型pFunParam,是一个函数指针。
然后,针对整个表达式声明一个类型:
typedef void (*pFun)(pFunParam);
即表示,类型pFun,是一个函数指针。此函数的参数类型为pFunParam。
最后,进行变量的声明:
pFun b[10];
- typedef
用途一:
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
char* pa, pb;
//
以下则可行:
typedef char* PCHAR;
PCHAR pa, pb;
char* pa, pb;
这种用法很有用,特别是char* pa, pb的定义,初学者往往认为是定义了两个字符型指针,其实不是,而用typedef char* PCHAR就不会出现这样的问题,减少了错误的发生。