精华内容
下载资源
问答
  •  int (*P)( ) 是函数指针,指向函数的指针, p 是一个指向函数入口的指针 变量, 该函数没有形参 函数的返回值是int 型 int *p() 是指针函数,返回值为指针的函数 p 是函数的入口地址, 该函数没有形参, ...

    根据右左法则 

     int (*P)( )  是函数指针,指向函数的指针,  p 是一个指向函数入口的指针 变量, 该函数没有形参  函数的返回值是int 型

    int  *p()   是指针函数,返回值为指针的函数     p 是函数的入口地址, 该函数没有形参, 返回值为  int * 型

    附代码

    #include <stdio.h>
    
    void print()
    {
        printf("helloworld\n");
    }
    
    int add(int x, int y)
    {
        return (x + y);
    }
    
    int main()
    {
        void (*p)();
        p = print;
        print();
        p();
    
        int (*q)(int , int );
        q = add;
        q(1, 2);
        add(1, 2);
    
        return 0;
    }

     

     代码中  void   (*P)()是一个函数指针, 指向一个没有形参, 没有返回值的函数

    p=print  即让指针p 指向函数 print  , 函数名本身就是函数的入口地址

     

     

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

    万次阅读 多人点赞 2019-05-09 18:36:17
    思维导图 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*型的,参数为指向字符串的函数。
    展开全文
  • 函数指针和指针函数用法和区别

    万次阅读 多人点赞 2018-05-24 08:11:10
    函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,...

    前言

    函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,特别是刚开始学习这门语言的童鞋,估计碰到这些东西就已经要崩溃了,然后好不容易死记硬背下来应付考试或者面试,然后过了几天发现,又是根本不会用,也不知道该在哪些地方用,这就尴尬了。
    今天这里只讲两个相对简单的,其实上面说那些太复杂的东西也真的很少用,即便是用了理解起来很麻烦,所以莫不如先深刻理解这两个比较容易的,并且项目中比较常用到。

    正文

    先来看看两者的定义以及说明。

    指针函数

    定义

    指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
    声明格式为:*类型标识符 函数名(参数表)

    这似乎并不难理解,再进一步描述一下。
    看看下面这个函数声明:

    int fun(int x,int y);
    

    这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值。
    接着看下面这个函数声明:

    int *fun(int x,int y);
    

    这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

    这样描述应该很容易理解了,所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。

    指针函数的写法

    int *fun(int x,int y);
    int * fun(int x,int y);
    int* fun(int x,int y);
    

    这个写法看个人习惯,其实如果*靠近返回值类型的话可能更容易理解其定义。

    示例

    (由于本人习惯于 Qt 中进行开发,所以这里为了方便,示例是在 Qt 工程中写的,其语法是一样的,只是输出方式不同)
    来看一个非常简单的示例:

    typedef struct _Data{
        int a;
        int b;
    }Data;
    
    //指针函数
    Data* f(int a,int b){
        Data * data = new Data;
        data->a = a;
        data->b = b;
        return data;
    }
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        //调用指针函数
        Data * myData = f(4,5);
        qDebug() << "f(4,5) = " << myData->a << myData->b;
    
        return a.exec();
    }
    
    

    输出如下:

    f(4,5) =  4 5
    

    注意:在调用指针函数时,需要一个同类型的指针来接收其函数的返回值。
    不过也可以将其返回值定义为 void*类型,在调用的时候强制转换返回值为自己想要的类型,如下:

    //指针函数
    void* f(int a,int b){
        Data * data = new Data;
        data->a = a;
        data->b = b;
        return data;
    }
    
    调用:
    Data * myData = static_cast<Data*>(f(4,5));
    

    其输出结果是一样的,不过不建议这么使用,因为强制转换可能会带来风险。

    函数指针

    定义

    函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
    声明格式:类型说明符 (*函数名) (参数)
    如下:

    int (*fun)(int x,int y);
    

    函数指针是需要把一个函数的地址赋值给它,有两种写法:

    fun = &Function;
    fun = Function;
    

    取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。

    调用函数指针的方式也有两种:

    x = (*fun)();
    x = fun();
    

    两种方式均可,其中第二种看上去和普通的函数调用没啥区别,如果可以的话,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数。当然,也要看个人习惯,如果理解其定义,随便怎么用都行啦。

    示例

    int add(int x,int y){
        return x+y;
    }
    int sub(int x,int y){
        return x-y;
    }
    //函数指针
    int (*fun)(int x,int y);
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        //第一种写法
        fun = add;
        qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ;
    	//第二种写法
        fun = &sub;
        qDebug() << "(*fun)(5,3) = " << (*fun)(5,3)  << fun(5,3);
    
        return a.exec();
    }
    
    

    输出如下:

    (*fun)(1,2) =  3
    (*fun)(5,2) =  2 2
    

    上面说到的几种赋值和调用方式我都分别使用了,其输出结果是一样的。

    二者区别

    通过以上的介绍,应该都能清楚的理解其二者的定义。那么简单的总结下二者的区别:

    定义不同

    指针函数本质是一个函数,其返回值为指针。
    函数指针本质是一个指针,其指向一个函数。

    写法不同

    指针函数:int* fun(int x,int y);
    函数指针:int (*fun)(int x,int y);
    可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。
    再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

    用法不同

    上面已经写了详细示例,这里就不在啰嗦了。

    总而言之,这两个东西很容易搞混淆,一定要深入理解其两者定义和区别,避免犯错。

    另外,本文都是针对普通函数指针进行介绍,如果是C++非静态成员函数指针,其用法会有一些区别,在另外一篇博客中单独介绍,文章在这里

    展开全文
  • 指针函数这块真是有点小纠结,前边刚乱七八糟结构,这就又指针函数,函数指针,指针数组了。 有点绕口,有点小猥琐,括号来括号去,指针来,数组去的。 其实就是简单记一下优先级,然后自己一边绕嘴一边往里排...

    这种东西读起来有点绕人,概念很唬人,括号来括号去的,其实就是C语言中数组、指针、函数概念的大合体,最起码不违背这三个概念和他们背后的规则。

    简单说就是——函数指针和指针数组的合体,先简单记一下优先级,然后自己往里排顺序即可,推出这个概念是一个循序渐进的没有意外的过程。


    万变不离其宗,想分清楚这些概念,只要识别谁是主语谁是修饰主语的定语就行了

    先分辨一下指针函数和函数指针~!

    指针函数:所谓函数类型,是指函数返回值的类型,那么指针函数,明显是返回指针的函数!如:

    type* func();

    为什么用返回值来定义函数的类型呢?想一想,在一个表达式里,返回值也就是你的“类型了,如下例:

    int func(){...};
    int a = 5,b = 6;
    a = b;
    a = func();

    那么这里的func()应该是返回int型的值,它和b是等价的,也就是说它是int型的。
    而函数指针:是指向函数的指针。说白了,他就是一个大小4字节(32位机)的指针,指向函数(即:以函数名为首地址标记的一段连续的内存地址)!

    void  (*func)(){...};


    注意:函数指针和指针函数只有一括(号)之遥,不要写错了——没了括号,*就代表返回指针了。

    为了清楚明白的说明,还是来一小段吧:

    #include<stdio.h>
    //测试指针函数和函数指针,在void*的情况下的区别
    void * ptrFunc();//指针函数
    //void ptrFunc();//这是绝对行不通的
    void func();//函数
    void (*funcPtr)();//函数指针
    
    void * ptrFunc(){
            printf("I'm ptrFunc()\n");
            char* str = (char*)malloc(5*sizeof(char));
            str[0] = 'l';
            str[1] = 'z';
            return str;
    }
    
    void func(){
            //printf("I'm func\n");
            printf("I'm func\n");
    }
    
    main(){
            char *str;
            str = (char*)ptrFunc();//force cast
    
            printf("%s\n",str);
            free(str);
            str = NULL;
    
            funcPtr = &func;
            funcPtr();
    }
    
    其中void * ptrFunc();代表返回类型是无类型的指针,不代表不返回,注意void*void的巨大区别。。。。


    那么下边来从基础概念推到出这个结合体——函数指针数组


    首先,指针数组的元素是指针fp

    *fp;

    其次,指针数组是指针*fp 的数组
    *fp[4];//[]优先级高,数组fp[4],再结合*,数组里的每个元素是一个指针,这就是指针数组了

    最后,要说函数指针了,正常的函数指针是这样来的:
    void func(char);
    void (*pf)(char) = func;//,相当于把函数名字替换成指针(*fp)

    现在要做的事就是把指针数组*fp[4]中的元素——指针*fp[0],*fp[1]....——指向函数
    用(*fp[4])来替换(*pf),
    在外边放上返回值void和参数(char)来表明函数,数组的元素就是指向void func(char)函数的了


    来看小实例:

    #include<stdio.h>
    
    
    double func1(double,double);
    double func2(double,double);
    double func3(double,double);
    double func4(double,double);
    
    
    
    
    int main(void){
        double (*fp[4])(double,double);//指向函数double func(double,double)的指针*fp的数组
        (fp[0]) = func1;
        (fp)[1] = func2;
        (fp)[2] = func3;
        (fp)[3] = func4;
        printf("%lf ",(fp)[0](6.6,4.4));
        printf("%lf ",(fp)[1](6.6,4.4));
        printf("%lf ",(fp)[2](6.6,4.4));
        printf("%lf ",(fp)[3](6.6,4.4));    
    
    
        return 0;
    }
    
    
    double func1(double a,double b){
        return a + b;
    }
    double func2(double a,double b){
        return a - b;
    }
    double func3(double a,double b){
        return a * b;
    }
    double func4(double a,double b){
        return a / b;
    }


    所以,别看”函数指针数组“读起来比较长比较绕,三个概念揉在一起,其实,拆起来也非常简单:
    首先,终极主语是数组,你看最后,是个数组吧?
    其次,次级主语是指针数组,你看,数组里边存的全是指针吧?
    然后,加上定语”函数“,数组里边的这些指针,指向的,都是函数吧?

    再然后,就没有然后了~~~~~

    分清主语定语,一步一步推出来就完了,错不了!

    很简单,不是么?


    C语言中有很多关键性的概念,只要把原理理解了,很多东西很容易推出来,没必要死记硬背,祝学习愉快~!


    对了,”函数指针数组“这东西有什么用?你把上例的那个数组中指针再弄多点,函数也弄多点,弄个几十个,就感觉到有用了,觉得都是0、1、2、3下标,感觉可读性差,弄个枚举代替数字就行了~~~~~

    个人肤浅看法,希望对各位有帮助,有质疑请提出~!






     
    
    展开全文
  • 指针函数和函数指针

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

    千次阅读 多人点赞 2019-05-25 09:43:47
    什么是函数指针 如果程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址,即是地址我们就可以定义一个指针变量来...
  • 指针数组 首先从名字就可以知道这是一个数组,是存放指针的数组。 先看几种指针数组: int * 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
  • 详解函数指针和类成员函数指针

    千次阅读 多人点赞 2017-11-12 21:35:56
    什么是函数指针函数指针,顾名思义即指向函数的指针。 如果要问,为什么能用一个指针指向一个函数呢?我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比从计算机原理的角度来理解更...
  • c语言函数指针_指针函数_返回值是函数指针

    千次阅读 多人点赞 2019-03-06 17:38:43
    函数指针作为函数的返回值 1.指针函数的定义 顾名思义,指针函数即返回指针的函数。其一般定义形式如下: 类型名 *函数名(函数参数表列); 其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”...
  • C++函数指针、指针函数、返回值为函数指针的函数浅谈 引言 函数指针、指针函数是C中重要而容易混淆的概念,博主将通过两个实例来说明这两个截然不同的概念。 而返回值为函数指针的指针函数就更难理解了,放在文章的...
  • 详解C语言指针函数、函数指针函数指针数组

    万次阅读 多人点赞 2018-07-09 11:08:24
    而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。 1. 指针函数 指针函数就是返回指针值...
  • 1.通过函数名调用函数和通过函数指针调用函数有什么区别呢? 首先函数名、函数指针都表示代码段的起始地址。 1)调用函数的时候必须指定函数名,可是当有时候不确定具体调用哪个函数,当某些事件发生后才确定...
  • 指针 指针数组 指针数组的指针 数组指针 数组指针的数组 函数指针 函数指针数组 指向函数指针数组的指针
  • 函数指针函数指针类型

    千次阅读 2018-09-29 08:48:59
    函数指针 1. 定义 每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。 注意:函数指针的本质是一个指针变量,且指针指向的函数的入口地址 2. 语法 指向函数的指针变量...
  • 指针函数与函数指针

    千次阅读 多人点赞 2018-04-16 23:26:12
    2)函数指针指的是指向函数的指针变量,本质是一个指针变量。 2.声明和定义 1)指针函数声明 类型关键字 *函数名(参数列表) 例: int *fun(int a,int b); 2)函数指针声明 类型关键字 (*函数名)...
  • 函数指针函数指针是指向可执行代码段或调用可执行代码段的信息块的指针,而不是指向某种数据的指针。函数指针是将函数当做普通数据那样存储和管理。函数指针有一种固定的形式,就是包含一个确定的返回值类型和若干...
  • 函数指针和指针函数

    千次阅读 2018-09-25 22:14:37
    函数指针 函数指针是指向函数的指针变量,所以函数指针首先是指针变量,只不过他指向的是函数; C/CPP在编译时,默认分配给函数一个入口,该入口即是函数指针所要指向的地址,可以用为两个用途: 调用函数 做函数...
  • 三、函数指针 四、函数指针数组 五、指向函数指针数组的指针 目录 1.指针数组 2.数组指针 3.函数指针 4.函数指针数组 5.函数指针数组的指针 一、指针数组 1.是一个存放指针的数组 2.举一个...
  • C++函数指针和回调函数

    千次阅读 2019-03-06 23:44:32
    什么是函数指针 函数指针就是指向函数的指针,指向某种特定的类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关,例如: bool lengthCompare(const string &amp;amp;, const string &amp;...
  • 函数指针与回调函数详解

    千次阅读 多人点赞 2016-09-29 14:08:30
    什么是函数指针函数指针就是指针。这个指针存放一个函数的地址,而函数的名称就该函数的入口,即地址。这类似于数组名就是数组的首地址。我们可以通过反汇编直观的查看到函数名和函数地址的关系。080483c4 <rfun>:...
  • 函数指针,指针函数,返回值为指针的函数

    万次阅读 多人点赞 2017-06-08 21:23:17
    在学习C语言时,一个比较容易混淆的概念就是函数指针、指针函数、返回值为指针的函数。本文将对这三个概念进行区分。指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同。函数指针就是一个指向...
  • 函数指针
  • c++ 函数指针

    万次阅读 多人点赞 2019-06-15 21:41:38
    函数指针基础: 1. 获取函数的地址 2. 声明一个函数指针 3.使用函数指针来调用函数 获取函数指针: 函数的地址就是函数名,要将函数作为参数进行传递,必须传递函数名。 声明函数指针 声明指针时,必须指定...
  • 函数指针函数指针数组,函数指针数组的指针

    千次阅读 多人点赞 2017-11-27 11:39:51
    数组指针 概念:数组指针指针,只要是指针他就占4个字节; 例如: 整形指针:int *p;能够指向整形数据的指针  浮点型指针:float *p;能够指向浮点型的数据的指针 那么数组指针,同样的理解就是指向数组的指针...
  • C语言指针函数和函数指针区别

    千次阅读 多人点赞 2019-02-28 15:24:46
    C语言函数指针和指针函数的区别 C和C++中经常会用到指针,和数据项一样,函数也是有地址的,函数的地址是存储其机器语言代码的内存的开始地址。 指针函数和函数指针经常会混淆,一个是返回指针的函数,另一个是指向...
  • 函数指针(指向函数的指针) 与数据项类似,函数也有自己的地址。函数的地址是存储其机器代码的内存的开始地址。例如,可以编写将另一个函数的地址作为参数的函数,这样第一个函数将能够找到第二个函数,并运行它。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,384,062
精华内容 553,624
关键字:

什么是函数指针