zoukankan      html  css  js  c++  java
  • 函数指针介绍及其用法

    1、前言

      这里有两个绕来绕去的东西,函数指针和指针函数;对于四个字,我们首先只看后面两个字,这样方便我们记忆;

      函数指针,本质是指针;是指向函数入口地址的指针。

      指针函数,本质是函数;返回类型为指针的函数。

    2、介绍

      对于一个函数而言,函数名是指向函数第一条指令的常量指针。在程序编译之后,编译器会为每个函数分配首地址,即该函数第一条指令的地址。一般情况下,我们可以用一个指针来保存这个地址,而这个指针就是函数指针。所以函数指针实际就是指向函数的别名,我们就可以用这个指针来调用这个函数。

    3、用途

      函数指针有两个用途:(1)调用函数,(2)做函数的参数

    4、声明方法

      普通声明方法:

     1 type (*f)(type &,type &);

      利用typedef来简化声明和定义的操作:

     1 typedef void (*vp) (int&,int&);

      具体的简化效果在后面给出例子明了地说明简化带来的方便。

    5、示例

      定义三个函数,分别对两个int型的变量做操作,up函数用于两个变量的加一操作,down函数用于两个变量的减一操作,print函数用于打印对应的操作和操作后的结果,实现代码如下:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 /* --- function declare --- */
     5 void up(int &a,int &b);
     6 void down(int &a,int &b);
     7 void print(void (*p) (int &,int &),int &a,int &b); //function pointer work as parameter
     8 
     9 /* --- main function --- */
    10 int main()
    11 {
    12     int a = 2,b = 3;
    13     char in = '1';
    14     while(in!='0')
    15     {
    16         cout<<endl<<"--- up(+) , down(-) , quit(0) ---"<<endl;
    17         cin>>in;
    18 
    19         void (*p) (int &,int &); //define function pointer
    20         switch(in)
    21         {
    22             case '0':
    23                 break;
    24             case '+':
    25                 p = up; //function pointer work as function caller
    26                 print(p,a,b);
    27                 break;
    28             case '-':
    29                 p = down;
    30                 print(p,a,b);
    31                 break;
    32             default:
    33                 cout<<"put error"<<endl;
    34         }
    35     }
    36 }
    37 
    38 /* --- function define --- */
    39 void up(int &a,int &b)
    40 {
    41     a++;
    42     b++;
    43 }
    44 void down(int &a,int &b)
    45 {
    46     a--;
    47     b--;
    48 }
    49 void print(void (*p) (int &a,int &b),int &a,int &b) //function pointer work as parameter
    50 {
    51     p(a,b);
    52     if(p==up)
    53         cout<<"up: "<<"a="<<a<<" b="<<b<<endl;
    54     else if(p==down)
    55         cout<<"down: "<<"a="<<a<<" b="<<b<<endl;
    56 }

      利用typedef简化之后的代码如下,可以看出的确较少了一部分繁琐又冗长的代码;

     1 #include<iostream>
     2 using namespace std;
     3 
     4 /* --- function declare --- */
     5 typedef void (*vp) (int&,int&);
     6 void up(int &a,int &b);
     7 void down(int &a,int &b);
     8 void print(vp,int &a,int &b); //function pointer work as parameter
     9 
    10 /* --- main function --- */
    11 int main()
    12 {
    13     int a = 2,b = 3;
    14     char in = '1';
    15     while(in!='0')
    16     {
    17         cout<<endl<<"--- up(+) , down(-) , quit(0) ---"<<endl;
    18         cin>>in;
    19 
    20         vp p; //define function pointer
    21         switch(in)
    22         {
    23             case '0':
    24                 break;
    25             case '+':
    26                 p = up; //function pointer work as function caller
    27                 print(p,a,b);
    28                 break;
    29             case '-':
    30                 p = down;
    31                 print(p,a,b);
    32                 break;
    33             default:
    34                 cout<<"put error"<<endl;
    35         }
    36     }
    37 }
    38 
    39 /* --- function define --- */
    40 void up(int &a,int &b)
    41 {
    42     a++;
    43     b++;
    44 }
    45 void down(int &a,int &b)
    46 {
    47     a--;
    48     b--;
    49 }
    50 void print(vp p,int &a,int &b) //function pointer work as parameter
    51 {
    52     p(a,b);
    53     if(p==up)
    54         cout<<"up: "<<"a="<<a<<" b="<<b<<endl;
    55     else if(p==down)
    56         cout<<"down: "<<"a="<<a<<" b="<<b<<endl;
    57 }

    运行结果:

    6、注意事项

    (1)声明函数指针时,其返回值类型、参数个数、参数类型等应该与需要它指向的函数保持一致,否者编译器会报错;

    (2)利用函数指针指向某一个函数的时候,只需要将函数名赋值给函数指针即可,不需要附带函数名后的参数;

    1 p = up; //correct
    2 p = up(a,b); //error
  • 相关阅读:
    VS 文件编码
    CSS中强大的EM 弹性布局
    编辑器【updating】
    下一代Jquery模板JsRender
    HTML 特殊符号编码对照表
    ASP.NET 文摘 [updating]
    Html5/Html CSS3/css 文摘 [updating]
    在Sublime Text 2中设置任意扩展名文件的默认语法
    Delphi笔记Indy10.5.5 IdTcpServer 与 IdTcpClient Demo 服务器端
    基于silverlight的工作流编辑器
  • 原文地址:https://www.cnblogs.com/Christal-R/p/7204852.html
Copyright © 2011-2022 走看看