C语言结构体中的函数指针-阿里云开发者社区

开发者社区> wuyudong> 正文

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

简介:
+关注继续查看

引言

指针是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 ;
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
linux时间相关结构体和函数整理
一、时间类型。Linux下常用的时间类型有4个:time_t,struct timeb, struct timeval,struct timespec,clock_t, struct tm. (1) time_t是一个长整型,一般用来表示用1970年以来的秒数.
663 0
Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型。
1188 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
8466 0
[实变函数]3.1 外测度 (outer measure)
1 并不是所有的集合都可求测度. 我们的想法是先对 $\bbR^n$ 中的任一集合定义一个``外     测度'' (outer measure), 然后再加上适当的条件 (Caratheodory 条件), 使 ``     外测度''  变为``测度'' (measure).
704 0
+关注
wuyudong
我的个人博客地址:http://wuyudong.com/
203
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载