精华内容
下载资源
问答
  • 函数指针指向函数代码的起始地址 定义 返回类型 (*指针变量名)( ) ; //如: int (*p)(int a,int b);//定义函数指针 使用 : //定义+赋值 int (*p)(int a,int b); int isdigit(int a...

    前两天在看FFMPEG源码,里边很多实用函数指针的地方,自己就顺便去看了看函数指针。记录备用。

    函数的指针

    函数指针:指向函数代码的起始地址

    定义

    返回类型  (*指针变量名)( ) ;  
    //如:
    int (*p)(int a,int b);//定义函数指针

    使用 :

    //定义+赋值
    int (*p)(int a,int b);
    int isdigit(int a,int b)
    {
    ...
    }
    p=isdigit;
    //引用
    a=isdigit(n,k);
    //等同于
    a=p(n,k);

    用途

    • 菜单选择的实现
    • 作为函数的参数

    例子一:菜单的实现

    在一个工资管理系统中有如下功能:
    1。添加员工;2。删除员工;3。修改员工信息;4。打印工资单;5。打印汇总表;6。退出。

    在设计中,一般把每个功能设计成一个函数。如添加员工的函数为add,删除员工的函数为delete,修改员工信息的函数为modify,打印工资单的函数为printSalary,打印汇总表函数为printReport。主程序是一个循环,显示所有功能和它的编号,请用户输入编号,根据编号调用相应的函数。
    1.不使用函数指针时,代码实现:

    int main()
    { int select;
      while(1) {     
       cout << "1--add \n";
       cout << "2--delete\n";
       cout << "3--modify\n";
       cout << "4--print salary\n";
       cout << "5--print report\n";
       cout << "0--quit\n";
       cin >> select;
    
      switch(select) 
      {
      case 0: return 0;
      case 1: add(); break;
      case 2: erase(); break;
      case 3: modify(); break;
      case 4: printSalary(); break;
      case 5: printReport(); break;
      default: cout << "input error\n";
      }
     }
    }
    

    这样写的缺点是代码太过冗长,如果有100个函数功能,那就要写很长了。
    2.使用函数指针,代码实现:

    int main()
    { int select;
      void (*func[6])() = {NULL, add, erase, modify, printSalary, printReport};//定义函数指针的数组,注意写法!
      while(1) { 
      cout << "1--add \n";
      cout << "2--delete\n";
      cout << "3--modify\n";
      cout << "4--print salary\n";
      cout << "5--print report\n";
      cout << "0--quit\n";
      cin >> select;
      if (select == 0) return 0;
      if (select > 5) 
      cout << "input error\n"; 
      else func[select]();
        }
    }

    这样写看着清爽很多,注意void (*func[6])() = {NULL, add, erase, modify, printSalary, printReport};是定义了一个函数指针的数组

    例子二:作为函数参数

    设计一个通用的冒泡排序函数,可以排序任何类型的数据 。
    如何表示要排序的数据:将快速排序设计成一个函数模板,将待排序的数据类型设计成模板参数
    不同类型的数据有不同的比较方式:向排序函数传递一个比较函数来解决。

    先回顾冒泡法

    void sort(int a[], int size)
    {   bool flag;//用于冒泡中提前结束冒泡
        int i, j;
        for (i = 1; i < size; ++i) {
            flag = false;
            for (j = 0; j <size - i; ++j)   
            if (a[j+1] < a[j])  {   
               int tmp = a[j];
               a[j] = a[j+1];
               a[j+1] = tmp;
               flag = true;
            }
               if (!flag) break;    
        }
    }

    这样写缺点是只能用于整型数的排序,现在写一个能适用于任意类型不符合排序规则的。把排序规则写在函数里边

    template <class T>//使用函数模板
    void sort(T a[], int size, bool (*f)(T,T))
    bool flag;//用于冒泡中提前结束冒泡
    int i, j;
    for (i = 1; i < size; ++i) {
            flag = false;
            for (j = 0; j <size - i; ++j)   
            if (f(a[j+1],a[j]))  //用函数f(T,T)来表示排序规则
            {   
               int tmp = a[j];
               a[j] = a[j+1];
               a[j+1] = tmp;
               flag = true;
            }
               if (!flag) break;    
        }
    }
    //排序规则
    bool decreaseInt(int x, int y) {return y<x;}
    bool increaseString(char *x, char *y)  {return strcmp(x,y)<0;}
    int main()
    {
           int a[] = {3,1,4,2,5,8,6,7,0,9}, i;
           char *b[]= {"aaa","bbb","fff","ttt","hhh","ddd","ggg","www","rrr","vvv"};
     
           sort(a, 10,  decreaseInt);
           for ( i = 0; i < 10; ++i) cout << a[i] << "\t";
           cout << endl;  
     
                sort(b, 10, increaseString );
           for (i = 0; i < 10; ++i) cout << b[i] << "\t";
           cout << endl;
    
          return 0;
    }
    
    展开全文
  • C++指向函数指针

    2014-03-19 11:21:43
    函数指针指向函数而非指向对象的指针。与其他类型的指针一样,函数指针指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。 函数指针的声明如下: 返回值类型 (*函数指针名)(函数参数...

    函数指针是指向函数而非指向对象的指针。与其他类型的指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。(类似C#中的代理)

    函数指针的声明如下:

    返回值类型 (*函数指针名)(函数参数列表)

    例如:double (*fun)(double, double)

    先看一个实例:

    #include <iostream>
    
    using namespace std;
    
    double add(double num1, double num2)
    {
    	return num1 + num2;
    }
    
    double add(double num1, double num2, double num3)
    {
    	return num1 + num2 + num3;
    
    }
    
    int main()
    {
    	double (*funAdd)(double ,double) = add;
    	double result = funAdd(12,13);
    	cout<<result<<endl;
    	double (*funAdd3)(double, double, double) = add;
    	result = funAdd3(1,2,3);
    	cout<<result<<endl;
    }

    运行结果如下:

    25
    6
    按任意键继续...

    函数指针只能通过同类型的函数或函数指针或0常量表达式进行初始化或赋值。

    函数指针有两个用途:调用函数和做函数的参数。

    做函数的参数实例如下:

    #include <iostream>
    
    using namespace std;
    
    void fun(int num1, int num2, int (*fp)(int, int))
    {
    	int result = fp(num1, num2);
    	cout<<result<<endl;
    }
    
    int add(int num1, int num2)
    {
    	return num1 + num2;
    }
    
    int  subtract(int num1, int num2)
    {
    	return num1 - num2;
    }
    
    int main()
    {
    	fun(12,13,add);
    	fun(12,13,subtract);
    	return 0;
    }

    运行结果如下:

    25
    -1
    按任意键继续...


    展开全文
  • c语言的函数指针和void *指向函数

    千次阅读 2018-08-22 14:52:12
    先说函数指针: void (*fun)(void); 这个就是一个函数指针了,函数的参数为空 void (*fun)(int); 这个也是一个函数指针,函数参数有个int 来看看void*类型: void *fun; 这样定义看起来很抽象,有...
    /*
    
    	首先要先理解两个类型的区别。
    
    	先说函数指针:
    		void (*fun)(void);    	这个就是一个函数指针了,函数的参数为空
    
    		void (*fun)(int);		这个也是一个函数指针,函数参数有个int
    	
    	来看看void*类型:
    		void *fun;				这样定义看起来很抽象,有没有,对于没有用过空类型的同学来说,
    								这样定义确实会让人一脸懵逼。
    								但是可千万别小看这个类型,这个类型可是C语言的精华所在啊,
    								因为它可以代表任意数据类型,没错是任意数据类型,例如:
    								int,float...这些基本数据类型就不用多说了,关键它还可以代表
    								结构体,联合体,枚举,函数。是不是很牛逼啊。
    
    	下面我主要介绍一下 函数指针 和 void指针指向函数
    
    */
    	void *fun;			//空指针
    	void (*fun_1)(void);//函数指针
    	void (*fun_2)(int);//函数指针
    
    	//-------------------------这里是空指针指向函数用法-------------------
    	printf("这里是空指针指向函数用法\n");
    	fun=test_func1;		//用空指针指向一个函数
    
    	/*
    		(unsigned int (*)(void))   这里是把这个空指针强制转换成函数指针
    	*/
    	(*  (unsigned int (*)(void))  fun)();	//运行该函数
    
    	fun=test_func2;		//用空指针指向一个函数
    
    	/*
    		(unsigned int (*)(void))   这里是把这个空指针强制转换成函数指针
    	*/
    	(*  (unsigned int (*)(int))  fun)(100);	//运行该函数
    
    	//-------------------------这里是函数指针指向函数用法-------------------
    	printf("这里是函数指针指向函数用法\n");
    	fun_1=test_func1;		//在这里,函数指针的类型必须和你指向函数的类型相同,类型相同主要针对参数
    
    	(*fun_1)();		//运行该函数
    
    	fun_2=test_func2;
    
    	(*fun_2)(100);		//运行该函数
    void test_func1()
    {
    	printf("函数1\n");
    }
    void test_func2(int v)
    {
    	printf("函数2\n");
    }

     

    展开全文
  • 比如 函数指针 函数是描述 本质是指针,这个指针指向函数地址 (那本质和描述的区别是?描述变了还是同一大类,本质变了就不是同一大类了) ===================================================================...
     
    
    注意一下:
    往往中文属于里形式如AB ,那么A是描述,B是本质。
    比如 数据库管理系统 数据库管理是描述 系统是本质 
    比如 函数指针 函数是描述 本质是指针,这个指针指向函数地址
    
    (那本质和描述的区别是?描述变了还是同一大类,本质变了就不是同一大类了)
    ======================================================================

    【函数指针】        在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。

    1.函数指针定义

    函数类型 (*指针变量名)(形参列表);

    “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

    例如:

    int (*f)(int x);

    double (*ptr)(double x);

    在定义函数指针时请注意:      函数指针和它指向的函数的参数个数和类型都应该是—致的;

    函数指针的类型和函数的返回值类型也必须是一致的。

    2.函数指针的赋值

    函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

    例如,

    int func(int x);   /* 声明一个函数 */

    int (*f) (int x);    /* 声明一个函数指针 */

    f=func;            /* 将func函数的首地址赋给指针f */

    赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

    3.通过函数指针调用函数

    函数指针是通过函数名及有关参数进行调用的。

    与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。

    由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:

    首先,要说明函数指针变量。

    例如:int (*f)(int x);

    其次,要对函数指针变量赋值。

    例如: f=func;    (func(x)必须先要有定义)

    最后,要用 (*指针变量)(参数表);调用函数。

    例如:    (*f)(x);(x必须先赋值)

    【例】任意输入n个数,找出其中最大数,并且输出最大数值。

    main()

    {

            int f();

            int i,a,b;

            int (*p)();    /* 定义函数指针 */

            scanf("%d",&a);

            p=f;            /* 给函数指针p赋值,使它指向函数f */

            for(i=1;i<9;i++)

            {                 scanf("%d",&b);

                    a=(*p)(a,b);    /* 通过指针p调用函数f */

            }

            printf("The Max Number is:%d",a)

    }

    f(int x,int y)

    {

        int z;

        z=(x>y)?x:y;

        return(z);

    }

    运行结果为:

    343 -45 4389 4235 1 -534 988 555 789↙

    The Max Number is:4389

    【指针函数】

    一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。

            返回指针的函数,一般定义格式为:

            类型标识符    *函数名(参数表)

    int *f(x,y);

    其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。f(x,y)是函数,其值是指针。

    如:char *ch();表示的就是一个返回字符型指针的函数,请看下面的例题:

    【例】将字符串1(str1)复制到字符串2(str2),并输出字符串2.

    #include "stdio.h"

    main()

    {

        char *ch(char *,char *);

        char str1[]="I am glad to meet you!";

        char str2[]="Welcom to study C!";

        printf("%s",ch(str1,str2));

    }

    char *ch(char *str1,char *str2)

    {

        int i;

        char *p;

        p=str2          if(*str2==NULL) exit(-1);

        do

        {

            *str2=*str1;

            str1++;

            str2++;

        }while(*str1!=NULL);

        return(p);

    }

    通过分析可得

    函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,

    函数指针可以用来指向一个函数。

    【指针常量】
    一个被声明为“char *const p”形式的指针,不能修改为指向内存中另外一处的地址,但可以修改它所指向的地址处的内容。
    【常量指针】
    一个被声明为“const char * p”形式的指针,可以修改为指向内存中另外一处的地址,但不能修改它所指向地址处的内容。
    【指向常量的常量指针】
    一个被声明为“const char * const p”形式的指针,地址和内容一旦确定,都不能修改。
    //const 离谁近,谁就不能修改!

    展开全文
  • 可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,...
  • #define _CRT_SECURE_NO_WARNINGS #include &lt;stdio.h&gt; #include &...//构造三个参数和返回值不同的函数; int fun1(int a, int b) { return a + b; } char* fun2(char* a, char* ...
  • 函数指针和指针函数

    千次阅读 2014-03-05 20:48:46
    可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。 1.函数指针定义 函数类型 (*指针变量名)(形参列表); “函数类型”说明函数的...
  • 指向 类成员函数 的 函数指针

    千次阅读 2008-05-08 19:18:00
    对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于...
  • 空指针与函数指针

    千次阅读 2016-04-10 17:36:20
    void 指针可以指向任意类型的数据,可以是整数,浮点数甚至字符串。唯一个限制是被指向的数值不可以被直接引用(不可以对它们使用引用星号*),因为它的长度是不定的,因此,必须使用类型转换操作或赋值操作来把void...
  • C语言中指向函数指针

    千次阅读 2017-10-12 22:11:01
    C语言中,如果想把函数A作为函数B的参数传递给B,那么就可以使用指向函数指针。 假设我们有一个函数,来描述小动物一天的生活。包括吃、睡、叫。其中所有种类的动物的吃和睡方式都一样,但叫的不一样。可能会...
  • Linux C 函数指针应用---回调函数

    万次阅读 2015-12-21 18:08:11
    (这里引用了知乎上一些知友的回答,...当一个函数指针指向了一个函数,就可以通过这个指针来调用该函数,可以将函数作为参数传递给函数指针。  那函数指针在我们实际编程中会起到怎样的作用呢?前一篇关于函数指针
  • 函数指针与指针函数

    千次阅读 2011-05-27 15:49:00
    可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,...
  • 函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。函数指针主要由以下两方面的用途:调用函数和用作函数参数。 函数指针的声明方法 ...
  • 可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。 1.函数指针定义 函数类型 (*指针变量名)(形参列表); “函数类型”说明函数的返回...
  • 函数指针VS函数对象

    千次阅读 2013-07-07 10:12:38
    如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。 ...
  • 可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。 1.函数指针定义 函数类型 (*指针变量名)(形参列表); “函数类型”说明函数的返回...
  • 指针篇之十一 函数指针

    千次阅读 2013-12-13 11:13:29
    函数可看作一组代表指令的二进制数集合,因此也能用指针指向和访问。函数指针就是指向可执行代码段中的某函数入口地址的指针,通过它可以把函数当成普通数据那样存储访问甚至移动拷贝。  函数指针定义为:返回值...
  • 通过线程来谈指针函数和函数指针

    千次阅读 2012-08-21 10:57:22
    线程中遇到pthread_create函数第三个参数 void *(*start_routine)(void *) 这个参数代表一个指针,这个指针指向的函数必须满足以下条件: 1、函数参数只有一个为void...函数指针:指向函数名的指针为函数指针。 e
  • 比较函数指针、函数符和lambda函数

    千次阅读 2016-07-18 19:05:32
    函数指针 函数指针即函数的地址,函数的地址是存储其机器语言代码内存的开始地址。函数的地址可作为其他函数的参数。 函数符 函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了...
  • 函数指针和函数对象

    千次阅读 2012-06-07 11:10:50
    函数指针指向函数的指针变量。本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口...
  • 指针函数和函数指针

    2014-09-01 13:18:02
    返回一个指针,至于什么类型的指针,看*号前面是什么,void* 表示函数返回一个指向任意类型的指针,int * 表示函数返回一个指向整型的指针 而下面是函数指针的定义: int (*fun)(int a); 真的极其的像...
  • 函数指针与C的面向对象

    千次阅读 2016-12-04 10:06:33
    一、C实现面向对象的基石—-函数指针:1、什么是函数指针:我们也许听过一级指针(指向普通变量的指针)、二级指针(指向指针的指针)、数组指针(指向数组的指针)、指针数组(数组元素是指针)等概念,那么函数...
  • 静态变量http://www.cnblogs.com/dongzhiquan/archive/2009/07/21/1994792.html 一文对静态变量进行了充分的阐述,现整理部分重要内容如下,加深印象。1、静态变量的存储方式和生命...2、静态局部变量:定义在函数体内
  • C语言 函数指针和指针函数及Main()函数

    万次阅读 多人点赞 2018-09-04 10:59:01
    指针函数,简单的来说,就是一个返回指针函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:类型标识符 *函数名(参数表) 这似乎并不难理解,再进一步描述一下。 看看下面这个函数声明: int ...
  • 函数指针

    千次阅读 2010-07-30 14:41:00
     函数指针简介  2. C 和 C++ 函数指针语法  3. 在C 和 C++里怎么实现回调函数 ?  4. 封装C和C++函数指针的仿函数  5. 相关链接    1.1 什么是函数指针?  1.2 开场...
  • 大话 函数指针 和 枚举这对鸳鸯

    千次阅读 2015-01-10 21:36:06
    (1)函数指针指向函数的指针变量,即本质是一个指针变量,是一个指向函数(可能是代码区)的首地址的指针,正如我们都知道,数组名就是指向数组第一个元素的常量指针,对于一个函数而言,函数名也是指向函数第一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 164,550
精华内容 65,820
关键字:

函数指针指向任意函数