C语言中的函数指针学习笔记
一、定义函数指针 return_type (*func_pointer)(parameter_list) 普通指针变量的定义 int * p; char * pointer; 类型的限定都在变量前面; 利用typedef 可以简化上面的表达方式。 typedef return_type (*FunctionPointer) (parameter_list); FunctionPointer func_pointer; 这样是不是容易读了,和上面的功能一样,定义了一个返回类型为return_type ,输入参数为parameter_list的函数指针。 二、定义返回函数指针的函数 方框圈出来的表示返回类型为函数指针,剩下的部分就表示一个function函数,输入参数为func_parameter_list。 void ( *signal( int sig,void (* handler)( int )))( int ); signal是一个返回函数指针的函数,signal的输入为int 变量和一个函数指针。 三、函数指针的使用 #include <stdio.h> int add(int a,int b); void main() { int(*fun1)(int a,int b) = add; int(*fun2)(int a,int b) = &add; int(*fun3)(int a,int b) = *add; printf("%dn",fun1(1,2)); printf("%dn",fun2(1,fun3(1,2)); char input[10]; gets(input); } int add(int a,int b) { return a + b; } 函数名会被隐式的转变为指针,前面加*和&操作符都不起作用,printf的结果都是3。 四、神奇的代码 int (*(*pf())())() { return nullptr; } 哇哦,这是个什么函数!画个框框分解它 小框表示返回的是一个函数指针,在圈个大框,又是一个函数指针。 typedef int(*Fun1) (); typedef Fun1(*Fun2) (); Fun2 pf() { return nullptr; } 这样看就舒服多了。 五、这又是什么鬼! (*(void(*) ())0)(); 画个框看看: 小框里代表一个函数指针,常数前面加括号代表类型的强制转换。咦,它把0强制转换成了一个函数指针,并执行!这是什么操作啊! #include <stdio.h> typedef int Function(int,int); typedef int(*FunctionPointer1) (int,int); typedef FunctionPointer1(*FunctionPointer2) (); int fun1(int a,int b) { return a + b; } FunctionPointer1 fun2() { return fun1; } FunctionPointer2 fun3() { return fun2; } int(*(*fun4())())(int,int) { return fun2; } void main() { Function* fuction = fun1; FunctionPointer1 fun = fun1; int a = fun3()()(3,4); int b = fun4()()(5,6); printf("%dn%dn",a,b); printf("fun1:%dn*fun1:%dn&fun1:%d",fun1,*fun1,&fun1); printf("fun:%dn*fun:%dn&fun:%d",fun,*fun,&fun); char chars[10]; gets(chars); } 函数名前面加不加*,&操作符,都是一个效果;函数指针前面加不加*操作符是一个效果,但是加上&操作符就代表着取指针的地址了。 Function* fuction = fun1; 七、一个问题 #include void hello() { printf("hello"); } int hello_1() { printf("hello 1"); return 0; } int main(void) { (*****hello)(); (****hello_1)(); } 执行结果是无论hello前面有多少个指针符号,都是执行hello()函数,打印“hello”。 void foo() { printf("Foo to you too!...n"); }; int a = 2; int* test() { return &a; } int main() { int i; void (*p1_foo)() = foo; void (*p2_foo)() = *foo; void (*p3_foo)() = &foo; void (*p4_foo)() = *&foo; void (*p5_foo)() = &*foo; void (*p6_foo)() = **foo; void (*p7_foo)() = **********************foo; (*p1_foo)(); (*p2_foo)(); (*p3_foo)(); (*p4_foo)(); (*p5_foo)(); (*p6_foo)(); (*p7_foo)(); i = *(***test)(); printf("i=%dn",i); } 上面的列子不出例外,都能正常打印我们想要的数据。 &&foo //EROOR &*&*&*&*&*&*foo //OK &******&foo //OK (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |