函数指针_函数指针数组 - CSDN
函数指针 订阅
函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。 展开全文
函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
信息
解    释
指向函数的指针变量
外文名
Function pointer
行    业
IT
中文名
函数指针
函数指针方法
函数指针的声明方法为:返回值类型 ( * 指针变量名) ([形参列表]);注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:int func(int x); /* 声明一个函数 */int (*f) (int x); /* 声明一个函数指针 */f=func; /* 将func函数的首地址赋给指针f */或者使用下面的方法将函数地址赋给函数指针:f = &func;赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。注2:函数括号中的形参可有可无,视情况而定。下面的程序说明了函数指针调用函数的方法:例一、ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。不过,在某些编译器中这是不能通过的。这个例子的补充如下。应该是这样的:1.定义函数指针类型:typedef int (*fun_ptr)(int,int);2.声明变量,赋值:fun_ptr max_func=max;也就是说,赋给函数指针的函数应该和函数指针所指的函数原型是一致的。例二、
收起全文
精华内容
参与话题
  • C++函数指针、指针函数、返回值为函数指针的函数浅谈 引言 函数指针、指针函数是C中重要而容易混淆的概念,博主将通过两个实例来说明这两个截然不同的概念。 而返回值为函数指针的指针函数就更难理解了,放在文章的...

    C++函数指针、指针函数、返回值为函数指针的函数浅谈

    引言

    函数指针、指针函数是C中重要而容易混淆的概念,博主将通过两个实例来说明这两个截然不同的概念。
    而返回值为函数指针的指针函数就更难理解了,放在文章的最后来介绍。

    函数指针

    函数指针是一种特殊的 指针,它指向函数的入口。
    例如int (*add)(int, int);定义了一个函数指针add,用于指向返回值为int,并且有两个int参数的函数,下面用实例来说明

    /**
     * 作者:lyn
     * 时间:2018.10.30
     * 此程序用来演示函数指针
     */
    #include<iostream>
    using namespace std;
    
    int addfunc(int a, int b) {
            return a + b;
    }
    int main() {
            int (*add)(int, int) = addfunc;
            //两种方法都可以
            //int (*add)(int, int) = &addfunc;
    
            int result = (*add)(1, 2);
            //两种方法都可以,建议使用第一种
            //int result = add(1, 2);
            cout << "通过函数指针调用函数进行计算结果:" << result << endl;
            result = addfunc(1, 2);
            cout << "通过直接调用函数进行计算结果:" << result << endl;
            return 0;
    }
    

    在这里插入图片描述

    指针函数

    指针函数是一种返回值为指针的 函数
    例如A *createA();声明了一个返回值为指向A类型的指针的,参数列表为空的函数(这句话读起来可能有一··绕口),实例说明

    /**
     * 作者:lyn
     * 时间:2018.10.30
     * 该程序用来演示指针函数
     */
    #include<iostream>
    using namespace std;
    class A {
            public:
                    A(int a) {
                            this->a = a;
                    }
                    int getA(){
                            return a;
                    }
            private:
                    int a;
    };
    
    //返回值为指向类型A的指针的函数
    A *createA() {
            return new A(1);
    }
    
    int main(){
            //创建一个指向A类型的指针,并调用createA创建一个A类型的对象
            A* b = createA();
            //通过指针调用类的方法
            cout << "b->a = " << b->getA() << endl;
            return 0;
    }
    

    在这里插入图片描述

    返回值为函数指针的函数

    其实在搞懂了函数指针和指针函数后,这个概念并不难懂,其实这就是一个复杂一点的指针函数,因为他的返回值为函数指针。
    先给一个例子:

    /*
    *本例是SGISTL源码中的一个函数,比普通的返回值为函数指针的函数要更复杂一点
    *因为本例中函数的参数也是一个函数指针
    */
    void (* set_malloc_handler(void (*f)()))()
    

    我们把例子从里往外看
    void (*f)()是一个函数指针,它用于指向一个返回值为void,无参数列表的函数
    * set_malloc_handler(void (*f)())这是一个指针函数,返回值为指针,它有一个参数,参数为一个函数指针(返回值为void,无参数列表的函数)
    void (* set_malloc_handler(void (*f)()))()这是一个指针函数,返回值为函数指针(返回值为void,无参数列表的一个函数),它有一个参数,参数为一个函数指针

    展开全文
  • C —— 函数指针

    2020-03-14 12:08:53
    在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址...

    在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

    定义函数指针

    因为指针存储的值是一块内存地址,而函数也是在内存的某个地址中,所以,当一个指针指向的内存地址指的是一个函数的话,这种指针被称为函数指针

    定义一个函数指针取决于被指向的函数的函数返回类型和参数列表。例如,有函数的定义如下:

    int max(int x, int y) {
    	return x > y ? x : y
    }
    

    则定义一个指针指向该函数的写法是:

    int (*p)(int, int) = &max;
    

    声明函数指针需要注意的事项:

    1. 指针对应的数据类型必须与函数返回值一致
    2. 指针参数列表必须与函数参数列表中的数据类型的顺序一致,不需要形参

    直接看一个案例,会更容易理解函数指针的定义

    #include<stdio.h>
    
    // 声明函数
    int fun1();
    int fun2(int x, double y);
    double fun3(int x, double y, int z, long i);
    void fun4(int x);
    void fun5(double x, int* p);
    int* fun6(int x);
    
    int main() {
    	// 声明函数指针
    	int (*p1)() = &fun1;
    	int (*p2)(int, double) = &fun2;
    	double (*p3)(int, double, int, long) = &fun3;
    	void (*p4)(int) = &fun4;
    	void (*p5)(double, int*) = &fun5;
    	int* (*p6)(int) = &fun6;	
    	return 0;
    }
    
    // 定义函数
    int fun1(){return 0;}
    int fun2(int x, double y){return 0;}
    double fun3(int x, double y, int z, long i){return 0.0;}
    void fun4(int x){}
    void fun5(double x, int* p){}
    int* fun6(int x){return NULL;}
    

    把函数指针看作是一个函数的影子,使其以变量的形式存在于程序中,进而可以到处被传递或者运用。换句话说,函数指针既能像函数一样被使用,又能像变量那样被传递。如下例所示:

    #include<stdio.h>
    
    void print(const char * cs) {
    	printf("%s\n", cs);
    }
    
    int main() {
    	void (*p)(const char*) = &print;
    	p("Hello World!");
    	return 0;
    }
    

    执行结果:

    Hello World!
    
    

    再来一个有返回的小案例:

    #include<stdio.h>
    
    int max(int x, int y);
    
    int main() {
    	int rm, rp, a = 10, b = 3;
    	int (*p)(int, int) = &max;	
    	
    	rm = max(a, b);
    	printf("max(%d, %d) = %d\n", a, b, rm);
    	
    	rp = p(a, b);
    	printf("p(%d, %d) = %d\n", a, b, rp);
    	
    	return 0;
    }
    
    int max(int x, int y) {
    	return x > y ? x : y;
    }
    

    执行结果:

    max(10, 3) = 10
    p(10, 3) = 10
    

    函数指针作为某个函数的参数

    一旦某个指针指向了一个函数后,当该指针以变量的形式传递到某个函数中,那么是能够在目标函数内调用该指针指向的函数的。案例代码如下所示:

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    #define SIZE 6
    
    /**
     * 求两个数的最大值
     */
    int max(int x, int y);
    /**
     * 得到一个随机的数组指针
     */
    int * randArray();
    /**
     * 求一个数组中最大的数字
     * @param array 指针数组
     * @param size 数组大小
     * @param *p 求最大值的函数
     */
    int maxInArray(int *array, int size, int (*p)(int, int));
    
    
    int main() {
    	int i, mv;
    	int * (*p)() = &randArray;
    	int (*m)(int, int) = &max;
    	// p() 等价于 randArray();
    	int *ns = p();
    	for(i = 0; i < SIZE; i++, ns++) {
    		printf("*ns[%d]=%d.\n", i, *ns);
    	}
    	// 当遍历结束后, ns 指向的是数组最后一个元素, 需要将其重置到索引为零的指针处
    	for(i = SIZE; i > 0; i--) {
    		ns--;
    	}
    	// mv = maxInArray(ns, SIZE, &max);
    	mv = maxInArray(ns, SIZE, m);
    	printf("max number is %d in array.\n", mv);
    	
    	return 0;
    }
    
    
    /**
     * 求两个数的最大值
     */
    int max(int x, int y) {
    	return x > y ? x : y;
    }
    /**
     * 得到一个随机的数组指针
     */
    int * randArray() {
    	static int nums[SIZE];
    	
    	srand((unsigned)time(NULL));
    	for(int i = 0; i < SIZE; i++){
    		nums[i] = rand();
    	}
    	return nums;
    }
    /**
     * 求一个数组中最大的数字
     * @param array 指针数组
     * @param size 数组大小
     * @param *p 求最大值的函数
     */
    int maxInArray(int *array, int size, int (*p)(int, int)) {
    	int m = 0, i = 0;
    	for(int i = 0; i < size; i++, array++) {
    		// p(1, 2) 等价于 max(1, 2)
    		m = p(m, *array);
    	}
    	return m;
    }
    

    执行结果:

    *ns[0]=13213.
    *ns[1]=23737.
    *ns[2]=15703.
    *ns[3]=17692.
    *ns[4]=14498.
    *ns[5]=26241.
    max number is 26241 in array.
    

    本例中,指针 p 和指针 m 都是函数指针,函数指针 p 在 main 函数中被调用,并返回一个数组指针,最后将返回的数组指针 和指针 m 都传递到 maxInArray 函数中,并在函数 maxInArray 中调用指针 m 指向的函数得到最终的结果。

    展开全文
  • 什么是函数指针?(理解及使用)

    千次阅读 2019-10-10 12:47:12
    思维导图 1. 定义: char* fun1(char* p1, char* p2)// 1 char** fun2(char* p1, char* p2);...很简单,char*是返回类型,fun1是函数名,括号内是参数 和1相似,char** 是返回类型 ...

    思维导图

    在这里插入图片描述

    1. 定义:

    	char* fun1(char* p1, char* p2)// 1
    	char** fun2(char* p1, char* p2);// 2
    	char*(*fun3)(char* p1, char* p2);// 3
    

    1,2,3分别是什么意思呢?

      1. 很简单,char*是返回类型,fun1是函数名,括号内是参数
      1. 和1相似,char** 是返回类型
      1. 就是我们要讲的函数指针,看下面的例子:
    	int (*) [10]p//数组指针
    

    是不是和数组指针特别的相似?这里的fun3不是函数名,是指针变量,它指向一个函数。
    函数指针的定义就是,一个指向函数的指针

    2. 例子

    我们上面定义了一个函数指针,那我们该如何使用它呢?

    int Add(int a, int b)
    {
    	return a + b;
    }
    
    int main()
    {
    	int(*fun1)(int a, int b);
    	fun1 = &Add;
    	cout << (*fun1)(1, 2) << endl;//使用函数指针
    	cout << fun1(1, 2) << endl;//可以直接使用fun1
    
    	system("pause");
    	return 0;
    
    }
    

    我们在使用指针的时候,需要通过钥匙“ * ”来取其指向的内存的值,函数指针使用也如此。通过用(*fun1)取出该地址的函数然后调用他。也可以直接使用fun1,因为函数名被编译后其实就是一个地址。

    3.(* (void(*))()0)()

    让我们来看看 《C的陷阱与缺陷》中的经典例题

    • 1.void(*),可以明白这是一个函数指针类型。这个函数没有参数,没有返回型
    • 2.(void(*)())0,这是将0强制类型转换为函数指针类型,0是一个地址,也就是说函数存在首地址为0的一段区域内。
    • 3.(* (void(*)())0)这里是取0地址开始的一段内存的内容,其内容就是保存在首地址为0的一段区域的函数
    • 4.(* ( void(*))()0)() 这里是函数调用

    4.函数指针数组

    	char* (*fun[3])(char* p);//函数指针数组
    

    它是一个数组,数组名是fun,数组内存了3个指向函数的指针。这些指针指向的一些返回值类型为指向字符的指针,参数为一个指向字符指针的函数。

    5.函数指针数组的指针

    我一开始看到这东西我脑子里都是???,然后查了些博客啥的就弄清楚了。我们都知道什么事数组指针,套用数组指针的理解来理解函数指针数组不就好了吗?

    char* (*(*fun)[3]))(char* p);
    
    • 1.(*fun),是一个指针。
    • 2.(*fun)[3],表示这个指针指向一个包含三个元素的数组
    • 3.去掉(* fun)[3],看上面的例子,char* (* )(char* p),可以知道数组中的三个元素是返回类型为char*型的,参数为指向字符串的函数。
    展开全文
  • 指针函数和函数指针的理解与应用

    千次阅读 2019-02-11 13:25:58
    指针函数 指针函数, 即返回值为指针函数, 本质上是一个函数, 我们先看下面实例: #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;time.h&amp;gt; int year; int mon; int day; ...

    指针函数

    指针函数, 即返回值为指针的函数, 本质上是一个函数, 我们先看下面实例:

    #include <stdio.h>    
    #include <time.h>    
    int year;    
    int mon;    
    int day;    
    char* GetDate();    
    int main() {    
      char* current = GetDate();    
      printf("今天是:%s\n", current);    
      return 0;                                                                                                                             
    }    
    char* GetDate() {    
      // 静态变量在函数调用结束后不会被释放    
      static char string[30] = {0};    
      time_t timep;    
      struct tm* p_time;    
      time(&timep);    
      p_time = gmtime(&timep);    
      year = p_time->tm_year + 1900;    
      mon = p_time->tm_mon + 1;    
      day = p_time->tm_mday;    
      sprintf(string, "%d-%d-%d", year, mon, day);    
      return string;    
    }    
    

    效果图:
    在这里插入图片描述
    以上是获取当前时间的一个指针函数–>GetDate, 是一个返回char类型指针的函数

    函数指针

    函数指针, 即指向函数的指针, 本质上是一个指针, 注意下面例子:

    #include <stdio.h>    
    void Eat(int num);    
    void Play(int num);    
    void Sleep(int num);    
    int main() {    
      void(*dosomeing)(int);    
      dosomeing = Eat;    
      dosomeing(2);    
      dosomeing = Play;    
      dosomeing(5);    
      dosomeing = Sleep;    
      dosomeing(7);                                                                                                                         
      return 0;    
    }    
    void Eat(int num) {    
      printf("我吃了 %d 碗饭\n", num);    
    }    
    void Play(int num) {    
      printf("我玩了 %d 局游戏\n", num);    
    }    
    void Sleep(int num) {    
      printf("我睡了 %d 个小时\n", num);    
    }    
    

    以上可以看出, 函数指针可以引用指定类型的函数, 使得在调用相同类型的函数时可以更加灵活.

    其实函数指针和数组结合(指针数组)可以实现典型的表驱动, 表驱动通过将相同类型的函数以指针的形式储存在数组中, 在调用过程中直接可以通过索引调用即可, 减少了if else条件的嵌套, 大大降低了程序的圈复杂度, 提高了效率:

    #include <stdio.h>                                                                                                                      
    int Add(int a, int b);
    int Minus(int a, int b);
    int Multiply(int a, int b);
    int Divide(int a, int b);
    int main() {
      int choice = 0;
      int result = 0;
      //函数指针类型
      typedef int(*T)(int, int);
      T menu[] = {
        Add,
        Minus,
        Multiply,
        Divide
      };
      printf("1.加法\n");
      printf("2.减法\n");
      printf("3.乘法\n");
      printf("4.除法\n");
      printf("请选择:");
      scanf("%d", &choice);
      if (choice > 0 && choice < 5) {
      	//等同result = (*menu)[choice - 1](4, 2);
        result = menu[choice - 1](4, 2);
      }
      printf("%d\n", result);
      return 0;
    }
    int Add(int a, int b) {                             
      return a + b;                                     
    }                                                   
    int Minus(int a, int b) {                           
      return b - a;                                     
    }                                                   
    int Multiply(int a, int b) {                        
      return a * b;                                     
    }                                                   
    int Divide(int a, int b) {                          
      if (b != 0) {                                     
        return a / b;                                   
      }
     return 0;
    }  
    

    这就是表驱动(转移表)的典型应用, 其中不仅涉及到了函数指针的应用, 同时又涉及到了指针数组的知识, 对于指针数组的概念和应用理解不深入的, 可以参考下方链接, 希望能帮助你:

    指针数组和数组指针

    有一个值得注意的点, 我们就Add函数而言, 以下两两等价:

    
    	T = Add;
    	T = &Add;
    
    	result = menu[0](4, 2);
    	result = (*menu)[0](4, 2);
    	
    

    这说明, 函数名本身就是一个指针, 与数组不同的是, 对函数名取地址的效果和不取函数名地址的效果完全一样, 按理来说, 对对函数名解引用更符合我们对函数指针的理解, 但是其实参数列表()已经起到了解引用的作用了

    希望本篇文章能给大家带来帮助, 欢迎大家的评论和建议

    展开全文
  • 指针函数,简单的来说,就是一个返回指针函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:类型标识符 *函数名(参数表) 这似乎并不难理解,再进一步描述一下。 看看下面这个函数声明: int ...
  • 函数指针&&指针函数

    2018-05-08 09:23:24
    1、函数指针如果在函数中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。定义一般函数指针的形式: 类型名 (*指针变量名) (函数...
  • 函数指针、指针函数、回调函数1.函数指针2.指针函数3.回调函数 1.函数指针 中国人说话很有意思,一般把最重要的东西放在最后,例如我是一个人见人爱花见花开的帅哥,那么我的本质就是一个帅哥。 同理: 指针函数的...
  • /*1、简单的函数指针的用法 形式1:返回类型 (*函数名)(参数表) 第一行:定义一个指针变量pFunc,它是一个指向某种函数的指针 第二行:定义了一个函数gFunc,该函数正好是一个以int为参数,返回为char的函数 从...
  • 函数指针和指针函数用法和区别

    千次阅读 2019-05-24 00:42:18
    函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,...
  • 一、函数指针的实质(还是指针变量) 1、函数指针定义格式:类型名 (*函数名)(函数参数列表); int (*pfun)(int, int); 2、函数指针的定义、赋值、调用 void func1(void) //定义一个函数,以方便下面定义函...
  • C语言中函数指针和回调函数的详解

    万次阅读 多人点赞 2019-05-18 23:10:01
    函数指针:指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个...
  • 指针函数和函数指针

    万次阅读 多人点赞 2019-03-30 16:21:36
    很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。 其实如果理解了这些...
  • 指向函数的指针 ------ 函数指针(function pointer)

    万次阅读 多人点赞 2017-11-24 20:50:11
    一个函数函数名是一个指针,它指向函数的代码。函数的调用可以通过函数名,也可以通过指向函数指针来调用。 定义形式:  类型 (*指针变量名)(参数列表); 例如:  int (*p)(int i,int j);  p是一个指针,...
  • 函数指针

    千次阅读 2019-02-06 17:01:44
    2.C++函数指针总结   1.在讲这个问题之前,我们要明白一个问题。就是我们为什么要把一个函数的地址作为参数传递给另一个参数。要知道在C语言中,一个函数内部是可以直接调用其他函数的,既然可以直接调用,为什么...
  • 详解C语言指针函数、函数指针函数指针数组

    千次阅读 多人点赞 2018-07-09 11:08:24
    而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。 1. 指针函数 指针函数就是返回指针值...
  • 函数指针函数指针数组的使用方法 函数指针函数指针包含函数在内存中的地址。数组名实际上就是数组的第一个元素在内存中的地址,类似地,函数名实际上也是执行这个函数任务的代码在内存中的起始地址。 函数...
  • 详解函数指针和类成员函数指针

    千次阅读 2017-11-13 09:52:51
    我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比从计算机原理的角度来理解更容易了。这里就简要回顾一下相关知识。 众所周知,计算机(图灵机)执行程序的基本流程就是:取指令->执行...
  • C++函数指针学习

    千次阅读 2019-03-30 16:09:58
    C++函数指针学习 博客搬家,原地址:https://langzi989.github.io/2017/09/08/C++函数指针学习/ 使用函数指针的优点 使用函数指针有助于我们设计出更优秀,更简洁更高效的程序。在下面的情景中我们常用到函数指针: ...
  • 函数指针函数指针是指向可执行代码段或调用可执行代码段的信息块的指针,而不是指向某种数据的指针。函数指针是将函数当做普通数据那样存储和管理。函数指针有一种固定的形式,就是包含一个确定的返回值类型和若干...
  • 函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。很多c++泛型算法以及linux...
1 2 3 4 5 ... 20
收藏数 1,174,754
精华内容 469,901
关键字:

函数指针