四联光电智能照明论坛

标题: C语言结构体中的函数指针 [打印本页]

作者: 风火石    时间: 2016-11-25 13:49
标题: C语言结构体中的函数指针

源文地址:http://www.cnblogs.com/archimede ... er-in-c-struct.html

引言

指针是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的结构体
  1. typedef  struct _str {
  2.        int  result ; // 用来存储结果
  3.        Operation  opt; // 函数指针

  4. } STR;
复制代码

现在来定义两个函数:Add和Multi:
复制代码
  1. //a和b相加
  2. int Add (int a, int b){
  3.     return a + b ;
  4. }
  5. //a和b相乘
  6. int Multi (int a, int b){
  7.     return a * b ;
  8. }
复制代码


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

  1. int main (int argc , char **argv){
  2.       STR str_obj;
  3.       str_obj.opt = Add;    //函数指针变量指向Add函数
  4.       str_obj. result = str_obj.opt(5,3);
  5.       printf (" the result is %d\n", str_obj.result );
  6.       str_obj.opt= Multi;    //函数指针变量指向Multi函数
  7.       str_obj. result = str_obj.opt(5,3);
  8.       printf (" the result is %d\n", str_obj.result );
  9.       return 0 ;
  10. }
复制代码

运行结果如下:
  the result is 8
  the result is 15

完整的代码如下:

  1. #include<stdio.h>

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

  7. //a和b相加
  8. int Add (int a, int b){
  9.     return a + b ;
  10. }

  11. //a和b相乘
  12. int Multi (int a, int b){
  13.     return a * b ;
  14. }

  15. int main (int argc , char **argv){
  16.       STR str_obj;
  17.       str_obj.opt = Add;    //函数指针变量指向Add函数
  18.       str_obj. result = str_obj.opt(5,3);
  19.       printf ("the result is %d\n", str_obj.result );
  20.       str_obj.opt= Multi;    //函数指针变量指向Multi函数
  21.       str_obj. result = str_obj.opt(5,3);
  22.       printf ("the result is %d\n", str_obj.result );
  23.       return 0 ;
  24. }
复制代码






欢迎光临 四联光电智能照明论坛 (http://5xhome.com/) Powered by Discuz! X3.2