可能指针函数与函数指针的概念不是很清楚
1.指针函数的概念其实跟普通函数的概率类似,就是一个函数的返回值是个指针类型!
#include<stdio.h> #include<iostream> using namespace std; int *pointFun(){ int *p=(int *)malloc(sizeof(int)); *p=1; return p; } int main(){ int *ptemp=pointFun(); printf("%d\n",*ptemp); }
2.函数指针还是比较有来头的
观察以下函数
#include<stdio.h> #include<iostream> using namespace std; void myfun(int x){ printf("%d\n",x); } void (*fun)(int); void (*fun2)(int); int main(){ (*myfun)(10); myfun(19); (&myfun)(190); fun=&myfun; (*fun)(123); fun(1234); //(&fun)(1234); fun2=myfun; fun2(456); (*fun2)(4567); }
如果以前没注意的话,会不会有毁三观的赶脚 = =
看一看内存中的情况
发现*myfun,&myfun,myfun都指了同一个地方
其实:(参考http://hi.baidu.com/bellgrade/blog/item/229f792d39e0a5e68a1399f3.html)
1. 其实,MyFun的函数名与FunP函数指针都是一样的,即都是函数指针。MyFun函数名是一个函数指针常量,而FunP是一个函数数指针变量,这是它们的关系。
2. 但函数名调用如果都得如(*MyFun)(10);这样,那书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许MyFun(10);这种形式地调用(这样方便多了并与数学中的函数形式一样,不是吗?)。
3. 为统一起见,FunP函数指针变量也可以FunP(10)的形式来调用。
4. 赋值时,即可FunP=&MyFun形式,也可FunP=MyFun。
3.函数指针的用途:
既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。所以,你还应知道函数指针是如何作为某个函数的参数来传递使用的。
即函数可以作为参数传递。
#include<stdio.h> #include<string.h> void MyFun1(int x); void MyFun2(int x); void MyFun3(int x); typedef void (*FunType)(int ); //②. 定义一个函数指针类型FunType,与①函数类型一至 void CallMyFun(FunType fp,int x); int main(int argc, char* argv[]) { CallMyFun(MyFun1,10); //⑤. 通过CallMyFun函数分别调用三个不同的函数 CallMyFun(MyFun2,20); CallMyFun(MyFun3,30); } void CallMyFun(FunType fp,int x) //③. 参数fp的类型是FunType。 { fp(x);//④. 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的 } void MyFun1(int x) // ①. 这是个有一个参数的函数,以下两个函数也相同 { printf("函数MyFun1中输出:%d\n",x); } void MyFun2(int x) { printf("函数MyFun2中输出:%d\n",x); } void MyFun3(int x) { printf("函数MyFun3中输出:%d\n",x); }
在第一次
在fp寻找函数的时候,在汇编的指令里跳转到了myFun1的函数地址