函数指针的使用
昨天在看go语言中参数声明的方式的博客发现了函数指针。c语言中指针的使用尤为复杂,其中函数指针的用法最实用也最复杂,总结一下函数指针的使用
函数类型和函数指针类型
函数类型就是一个函数,函数指针就是一个指向函数的指针,需要注意的是在我们把一个函数赋值给一个函数指针的时候,会自动把函数类型转型为函数指针
int (*p)(int a,int b)=test
//test是一个函数,自动转型
int (*p)(int a,int b)=&test
//这种是正常函数指针赋值
函数指针的创建
int (*p)(int a,int b);
注意 int *p(int a,int b)
形式是错的,这个形式是声明一个函数,函数名是p,返回值类型是 int*
,两个参数是都是int类型
这样就创建了一个函数指针,这个指针的变量名是p,参数是两个int类型的整数,返回值是int类型
1 | //a simple demo |
参数是函数指针的函数
void test2(int (*p)(int a,int b),int a,int b)
这个形式创建了一个函数,函数名是test2,第一个参数是一个函数指针int (*p)(int a,int b)
,第二个和第三个参数是int类型
函数声明也可以丢掉变量名 void test2(int (*)(int ,int ),int ,int );
1 | //demo 2 |
返回值是函数指针类型
int (*test2())(int a,int b)
这样就声明了一个函数,函数名是test2,返回值是一个函数指针,这个函数指针返回值是int,参数是两个int。注意 最后面的两个int是函数指针的参数,需要主要的是假如函数的参数为空,最好在函数的参数列表中加一个void,增加可读性
int (*test2(void))(int a,int b)
1 | #include <stdio.h> |
typedef 函数指针
1 | typedef int (*p1)(int x);//p1是函数指针类型 |
1 | #include <stdio.h> |
p2和p3是函数类型,所以在定义的时候一定要声明函数指针,否则会报错function 'tmp2' is initialized like a variable|
函数指针的数组
void (*functionarray[10])(void);
声明一个函数数组,数组名字叫做functionarray,容量为10,参数是void,返回值为void
1 | //a simple demo for function point array |
参考链接
https://blog.csdn.net/nohackcc/article/details/16961691
http://www-ee.eng.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.3.1.html
https://www.cprogramming.com/tutorial/function-pointers.html
https://stackoverflow.com/questions/20617067/returning-function-pointer-type
https://overiq.com/c-programming/101/typedef-statement-in-c/
https://stackoverflow.com/questions/11038430/how-to-create-a-typedef-for-function-pointers
https://stackoverflow.com/questions/1591361/understanding-typedefs-for-function-pointers-in-c
https://stackoverflow.com/questions/4295432/typedef-function-pointer
http://www.learncpp.com/cpp-tutorial/78-function-pointers/
https://stackoverflow.com/questions/7321993/reference-to-function-syntax-with-and-without