指针函数和函数指针详解


函数指针和指针函数就像绕口令一样的,有时候让人难以琢磨透,但是按照语法分析,一个是函数,一个是指针,因此区别还是蛮大的,下面针对函数指针和指针函数的进行说明。


话分两头,先说简单的——指针函数就一句话:指针函数就是返回值为指针的函数。


然后就介绍今天的重头戏,函数指针。

  1. 函数指针的定义
  2. 识别函数指针的方法
  3. 函数指针的赋值
  4. 如何通过函数指针调用函数?
  5. 定义函数指针的实例及结构体中的函数指针。

函数指针的定义

指针函数是指指向函数代码的首地址的指针变量,其格式如下:

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

其定义有以下3点需要注意:

  1. 函数类型即函数的返回类型,需与函数本身的返回类型一致。
  2. 形参列表是一个指针变量,指向函数所带参数的列表。
  3. 函数指针和它指向的函数的参数个数和类型要一致。

识别函数指针的方法–左右法则

首先从最里面的圆括号开始看起,然后往右看,再往左看;每次遇到圆括号就应该掉转阅读方向,一旦解析完圆括号的东西,就跳出圆括号。

函数指针的赋值

函数名就代表了函数代码的首地址,直接将函数指针指向函数名就行了。

如何通过函数指针调用函数?

步骤如下:

  1. 申明函数指针的变量
  2. 将函数名赋值给函数指针变量
  3. 用(*指针变量名)(参数表);进行函数调用

定义函数指针的实例及结构体中的函数指针

代码如下:

/* 定义三个函数指针 */
typedef int(*init)(void);
typedef void (*proc)(int msgc, char* msg);
typedef int (*term)(void):

/* 结构体中放入三个函数指针 */
typedef struct modules
{
   init modules_init;
   proc modules_proc;
   term modules_term;
}modules_tag;

/* 申明函数指针结构体 */
static modules_tag audio;

/* 实现函数指针对应的函数体 */
static int audio_init(void)
{
   int ret = 0 ;
   /*
    *  do some things here !
    */
   return ret ;
}

static void audio_proc(int msgc, char* msg)
{
   int ret = 0 ;
   while(1)
   {
   
     /*
      *  do some things here !
      */
   
    }
}

static int audio_term(void)
{
   int ret = 0 ;
   /*
    *  do some things here !
    */
   return ret ;
}

/* 赋值 */
audio = {audio_init;  audio_proc;  audio_term;}

/* 调用 */
int main(int argc, char **argv)
{
  int argc =2;
  char args[] = {0,1};
  audio.modules_init();
  audio.modules_proc(argc , args);
  audio.modules_term();
  return 0;
}

以上程序简单介绍了函数指针的常规用法。

发表评论

电子邮件地址不会被公开。 必填项已用*标注