guangzhou



shanghai

Recent posts:
Blog index
About
RSS

C语言结构体中的函数指针

June 27, 2015     C   614   

原创文章,转载请注明: 转载自工学1号馆

这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础

引言

指针是C语言的重要组成部分, 于是深入理解指针并且高效地使用指针可以使程序员写出更加老练的程序。我们要记住指针是一个指向内存地址的变量。指针可以引用如int、char……常见的数据类型,例如:

int * intptr;     // 声明一个指向整型值的指针 
int intval = 5 ;  // 定义一个整型变量 
intptr = & intval ; // intptr现在包含intval的地址

指针不仅仅指向常规的类型还可以指向函数

函数指针

函数指针的内容不难理解,不再赘述,参见《C语言函数指针的用法

语法

要声明一个函数指针,使用下面的语法:

Return Type  * function pointer’s variable name ) ( parameters 

例如声明一个名为func的函数指针,接收两个整型参数并且返回一个整型值

int (*func)(int a , int b ) ;

可以方便的使用类型定义运用于函数指针:

typedef int (*func)(int a , int b ) ;

结构体中的函数指针

我们首先定义一个名为Operation的函数指针:

typedef int (*Operation)(int a , int b );

再定义一个简单的名为STR的结构体

typedef  struct _str {
       int  result ; // 用来存储结果
       Operation  opt; // 函数指针 

 } STR;

现在来定义两个函数:Add和Multi:

//a和b相加
int Add (int a, int b){
    return a + b ;
}
//a和b相乘
int Multi (int a, int b){
    return a * b ;
}

现在我们可以写main函数,并且将函数指针指向正确的函数:

int main (int argc , char **argv){
      STR str_obj;
      str_obj.opt = Add;    //函数指针变量指向Add函数
      str_obj. result = str_obj.opt(5,3);
      printf (" the result is %d\n", str_obj.result );
      str_obj.opt= Multi;    //函数指针变量指向Multi函数 
      str_obj. result = str_obj.opt(5,3);
      printf (" the result is %d\n", str_obj.result );
      return 0 ;
}

运行结果如下:

the result is 8

the result is 15

完整的代码如下:

#include<stdio.h>

typedef int (*Operation)(int a, int b);
typedef struct _str {
    int result ; // to sotre the resut
    Operation  opt; // funtion pointer 
 } STR;

//a和b相加
int Add (int a, int b){
    return a + b ;
}

//a和b相乘
int Multi (int a, int b){
    return a * b ;
}

int main (int argc , char **argv){
      STR str_obj;
      str_obj.opt = Add;    //函数指针变量指向Add函数
      str_obj. result = str_obj.opt(5,3);
      printf ("the result is %d\n", str_obj.result );
      str_obj.opt= Multi;    //函数指针变量指向Multi函数 
      str_obj. result = str_obj.opt(5,3);
      printf ("the result is %d\n", str_obj.result );
      return 0 ;
}

 

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

No comments yet.
To verify that you are human, please fill in "七"(required)