函数指针
/*{{{*/
/*
* expression error right 说明
*
* *p.f (*p).f *(p.f) . 的优先级高于*
*
* int *ap[] ap是一个指向int数组的指针 ap是一个指向元素为int指针 [] 高于 *
* int(*ap)[] 的数组 int * (ap[])
*
* int *fp() fp是一个函数指针,所指函数 fp是一个函数,返回int* 函数() 高于*
* 返回int int(*fp)() int* (fp())
*
*
*/
char * const *(*nexta)();
/* next是一个函数指针,所指函数返回一个指针,这个指针指向一个类型为char的常量指针 */
char * const (*nextb)(); /* 与上面有什么区别? */
char * (*nextc)();
/* next 是一个函数指针,所指函数返回一个指针,这个指针返回类型: char * */
char *(*c[10])(int **p) ;
/* c是一个数组,数组里的元素是函数指针a,a所指函数的参数类型是int** ,返回值是一 个指向char类型的指针*/
char * (*funa(int*))(int* ) ;/* fun是一个函数指针, 所指函数参数类型 int* , 返回类型 char * (*fun)(int*) */
char * (*funb)(int*); /* fun是一个函数指针,所指函数的参数类型 int * , 返回类型 char * */
int(*func())(); /* fun是函数指针,返回一个函数指针,这个这个函数指针所指的函数,返回值为int,无形参 */
int(*fooa())[] ; /* foo是函数指针,返回一个指向数组的指针,这个数组里的元素类型是int */
int(*foob[2])() ;
/* foo是一个数组,数组里是函数指针a,a所指函数返回值是一个函数指针b,b所指函数返回值是int无形参 */
int fooc[][3] /* 数组的数组 */
实例1:
#include <stdio.h>
/* 定义函数指针类型 */
typedef int (*PFUNCA)(int a );
/* 定义指针变量 */
PFUNCA pfa; /* int (*pfa)(int a) */
/* 定义回调函数*/
int CallBack( int a ){
return ++a;
}
/* 调用者函数 */
int Caller( PFUNCA cb,int a ) /* void Caller( int (*cb) ( int ) ) 也可这样申明*/
{
return cb( a );
}
/* 定义函数指针的指针类型
*/
typedef int (**PPFUNCA) ( int aPara );
/* 调用者函数
*/
/*void PtrCaller( PPFUNCA cb );*/
int PtrCaller( int (**cb) ( int ) , int num ) // 原型申明
{
return (*cb)(num); // nRet = 1000;
}
/* 使用回调
*/
void Test(){
/* 函数指针 */
printf( "%d\n" , Caller( CallBack, 2 ) ); // 直接使用回调函数
PFUNCA cb = CallBack; // int (*cb) ( int ); cb = CallBack;
printf( "%d\n" , cb(99) );
/* 函数指针的指针 */
printf( "%d\n" , PtrCaller(&cb,20) ); /* ok */
/* printf( "%d\n" , PtrCaller(&CallBack,20) ); error ??? */
/* 指针数组 */
PFUNCA fArray[10]; /* int (*fArray[10]) ( int ); */
int i ;
for ( i = 0; i < 10; i++ ){
fArray[i] = CallBack;
printf( "%d\t" , fArray[i](i) ) ;
}
}
int main()
{
Test();
return 0 ;
}
浙公网安备 33010602011771号