C/C++函数指针

2016-12-14 09:56:14来源:http://blog.csdn.net/Charles_Zhang_Ng/article/details/533504作者:Charles_Zhang_Ng人点击

函数的指针


与数据相似,函数也是有地址的。所以我们可以用指针来指向它。


1.函数指针的基础知识


1)获取函数的地址.


函数的地址就是函数名,后面不跟 (参数)


例如think()是一个函数,那么think就是函数的地址。如果要将函数地址作为参数传递,传递的必须是函数名。


         process(think);   //传递think函数的地址
process(think()); //传递的是think函数的返回值

2)声明函数指针


声明指向某种数据的类型的指针时,必须制定指针指向的类型。函数类型是由:函数的返回类型和特征标(参数列表)决定的


声明函数指针只需要将函数名替换即可。


         声明函数 double pam(int);
声明函数指针 double (*pf)(int);

(*pf) 括号不能少,括号的优先级比*运算符高,*pf则代表pf()是一个返回指针的函数,而(*pf)(int)意味着pf是一个指向函数的指针。


因为pam是函数,所以(*pf)也是函数,pf就是函数指针。声明pf后,便可以将对应数据类型的函数地址赋给它:


         double pam(int);
double (*pf)(int);

pf = pam; //函数名就是函数的地址,不加&


返回类型和特征标不同的函数和函数指针不能赋值.


3)使用函数指针来调用函数


上面说到(*pf)
pam 都是函数,所以在使用(*pf)时,将它看做函数名即可:


          double x = pam(4);
double y = (*pf)(5); //以上两者等

另外在C++中也可以像使用函数名那样使用pf


         double y = pf(5);  // 使用函数指针也可以调用函数

2.深入探讨函数指针


这里声明了三个函数,他们的返回类型和特征标相同:


       const double *f1 (const double ar[], int n);
const double *f2(const double [], int n);
const double *f3(const double*, int n);

这些函数虽然特征标看起来不同,实则相同。如果看不懂请回看数组作为函数参数方面的知识。


声明一个函数指针:


       const double (*pa)(const double *, int n) = f1;  //声明的同时进行初始化

C++11中的自动类型推断功能更为简单:


       auto p2 = f2;  //p2声明为函数指针,同时f2的地址赋给p2

函数调用:


       cout  <<  (*p1)(av,3)  <<  ”:  ”  <<  *(*p1)(av,3)  <<  endl;
cout << p2(av,3) << “: ” << *p2(av,3) << endl;

由前面的知识可知,*(p1)(av,3)p2(av,3)都调用指向的函数,av3作为参数,返回的时const
double * (double
值的地址),


所以前半部分都将打印出一个double值的地址,


需要查看实际值则需要在返回的地址前面加 * 就可以打印地址中的值。如(*(*p1)(av,3), *p2(av,3)


开始时声明三个函数,就需要声明三个函数指针,则可以声明一个函数指针数组。


声明函数指针数组和声明单个函数指针大致差不多,
指针名后面加上数组
[3]:


       const double *(*pa[3])(copnst double *, int ) = {f1,f2,f3};

如果想用auto声明一个函数指针数组:


       auto  pb = pa;    // 错误 auto只能用于单值的声明

声明函数指针数组时,不能使用autoauto自动推断只能用于单值初始化。数组名是指向第一个元素的指针。


pa是指向函数指针的指针,所以pb也会被声明为指向函数指针的指针。


使用函数指针数组来调用函数:


       const double *px = pa[0](av,3);   //使用函数指针
const double *py = (*pb[1])(av,3); //使用函数

获取返回的double值需要加*


       const double x = *pa[0](av,3);
const double y = *(*pb[1])(av,3);

声明指向整个数组的指针可以使用auto


       auto pc  =  &pa;  // pc 指向整个pa函数指针数组

不使用auto声明,令指针名为pd,用*pd取代pa


       const double *  (*(*pd)[3])(const double * , int) = &pa;

要用pd调用函数,pd指向函数指针数组,那么*pd就是数组名,(*pd)[i]是数组中的元素即函数指针。


(*pd)[i](av,3)是函数调用,*(*pd)[i](av,3)返回指针指向的值。


也可以用第二种(*(*pd)[i])(av,3)来调用函数,*(*(*pd)[i])(av,3)返回指针指向的值。


pa &pa之间有差别,大多数情况下pa是数组第一个元素的地址,即&pa[0].因此他是单个指针的地址,


&pa是整个数组的地址,pa&pa值相同,但类型不同。


要得到第一个元素的值,只需对pa解除一次引用,但需要对&pa解除两次引用:


       *pa == **&pa == pa[0]

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台