函数指针&指针函数&结构体调用函数


结构体通过指针调用函数的方法在项目中比较实用:上层函数实现,底层调用从而实现底层通知上层的回调功能!!!
在此说一下函数指针指针函数这两个概念,下面先说一下两者的区别。
再者就是说一下结构体是如何通过函数指针的方式调用函数的。


//------------------------------------------------------------------------------------------------------------//
#include "stdio.h"

  struct DEMO

  {

  int x,y;

  int (*func)(int,int); //函数指针

  };

  int add2(int x,int y)

  {

  return x+y;

  }

  void main()

  {

  struct DEMO demo;

  demo.func=&add2; //结构体函数指针赋值

      //demo.func=add2;//这样写也可以?!通过TC验证&add2和add2打印结果相同。

  printf("func(3,4)=%d\n",demo.func(3,4));

  }
//------------------------------------------------------------------------------------------------------------//


 

1、指针函数

指针函数本质是一个函数,函数返回类型是某一类型的指针。

定义格式 :函数类型   *  函数名( 参数列表)

例:  int   * func1 (x, y )    返回值为 整型类型指针的函数

char   * func2 (x, y )          返回值为 字符类型指针的函数

这里 func1(x, y ) 和func2(x,y)都是函数。调用时直接写func1(),不用加 *,而且不能把一个指针赋给此函数func1或func2;

                                

  例如: 

 #include "stdio.h"                           

char *func(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);

} 

main()

{    char str1[]="hello world!";

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

printf("%s",func(str1,str2)); //func(str1,str2))是指针

 }


2、函数指针

 函数类型 (*指针变量名)(形参列表)第一个括号一定不能少

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

 注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。

例  int F();//声明一个函数;

int (*P)() ;// 声明函数指针

main()

{ P=F;

 (*P)();//调用函数

} 



 3、易混淆之处

 int *(*func) ( x,y); //第一个星花*表示此函数是个返回值为整型指针的函数,第二个星花*表示func为函数指针。  

函数调用的方法:  (*func)(x,y); 

            4、结构体调用函数的方法

                    调用方法 :结构体增加函数指针为成员变量

                   例:

                         typedef  struct  student

                        {

                                 int   xPosition;

                                 int   yPosition;

                                 void  ( *fun ) (x ,y );

                        } stu;    //定义一个结构体

                         MyFunc();    //声明并定义一个函数

                         ... ...                     

                       stu  Xiaoming[1]={ 0,0, MyFunc };   //实现一个结构体                      

                        func=MyFunc;   // 给结构体的函数指针赋值

                       Xiaoming.func(x, y);  //调用结构体中的函数

                        注意结构体调用函数时,和一般调用函数指针时不一样,这里不需要加那个星花 *

                        一般调用带函数指针的函数的方法是:(* func)(x, y);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值