函数指针总结

2013年09月21日 分类:学习笔记C++

最近复习c语言,这里总结一下函数指针。

1.函数指针定义

首先是一般函数指针的定义:

int (*funcPtr)(char *, int);

其中两个括号是不可缺少的,(*funcPtr)表明funcPtr是一个指针,(char *, int)表明func是一个函数,函数参数为char *和int,返回值为int。接下来看下一个:

int *(*funcPtr)(char *, int);

和上面的一样,两个括号说明func是函数指针,不同的是前面的int *,表明该函数的返回值为int指针。

1.1 函数指针数组

函数指针数组的定义:

int *f[]; //元素为int *的数组
int (*funcPtr[])(char *, int);

[]的优先级较高,所以func是数组,里面的元素为函数指针,所指向的函数原型为int func(char *, int)。

1.2 函数指针作为参数

函数指针作为一种类型同样可以作为函数的输入与输出。

void func(int x, int (*funcPtr)(char *, int));

作为输入参数时就是上面的定义,作为返回值时有点复杂了。

void (*func(int x, int y))(int);

这里括号的优先级最高,func(int x, int y)表面func是一个函数,前面的*表明返回值为一个指针,(int)说明该指针为一个参数为int的函数,void表示该函数指针的返回值为void。 上面我们定义了一个返回值为函数指针的函数,那怎么定义一个函数指针指向该函数呢,看下面:

//一步一步来写,首先他是一个函数指针
(*funcPtr)()
//指向的函数的参数为int x, int y
(*funcPtr)(int x, int y)
//指向的函数的返回值为一个指针
(*(*funcPtr)(int x, int y))
//指向的函数的返回值为一个指针,该指针是参数为int的函数指针
(*(*funcPtr)(int x, int y))(int)
//指向的函数的返回值为一个指针,该指针是返回值为void的函数指针
void (*(*funcPtr)(int x, int y))(int)

最后的那个就是指向返回值为函数指针的函数指针,分步写的话还是很清晰的。 仔细观察会发现函数指针和函数原型就差一个(*),如果知道函数原型的话将函数名改成指针就行了。

void (*func(int x, int y))(int);
void (*(*funcPtr)(int x, int y))(int);

1.3 typedef定义

另一种简单的方法是使用typedef,将函数指针定义成一种类型后,可以方便的在函数中使用。

typedef void (*funcPtr1)(int);//定义返回值的函数指针
funcPtr1 (*funcPtr)(int x, int y);//这个看起来清楚多了

2. 函数指针用法

函数指针的用法很简单,可以像其他指针变量一样用*引用,也可以直接用名字调用。

int f(int);

int (*pf)(int) = &f;
int x;
x = (*pf)(123);
x = pf(123);
作者:wuyuan 本文来自Wuyuan's Blog 转载请注明,谢谢! 文章地址: https://wuyuans.com/2013/09/function-pointer