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

本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-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的结构体

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 ;
}

C语言结构体中的函数指针的更多相关文章

  1. 在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  2. C语言结构体及typedef关键字定义结构体别名和函数指针的应用

    结构体(struct)的初始化 struct autonlist { char *symbol; struct nlist nl[2]; struct autonlist *left, *right; ...

  3. 【嵌入式开发】C语言 结构体相关 的 函数 指针 数组

    . 作者 : 万境绝尘 转载请注明出处 : http://www.hanshuliang.com/?post=30 . 结构体概述 : 结构体是 多个 变量的集合, 变量的类型可以不同; -- 可进行 ...

  4. C语言 结构体中的零长度数组

    /* C语言零长度数组大小和取值问题 */ #include <stdio.h> #include <stdlib.h> #include <string.h> s ...

  5. C++结构体中使用函数与类中使用函数小结

    #include <iostream>#include <string.h>using namespace std;struct stud//学生信息结构体{    char ...

  6. C语言 结构体中属性的偏移量计算

    //计算结构体偏移量 #include<stdio.h> #include<stdlib.h> #include<string.h> //详解:对于offscfof ...

  7. C语言 结构体中的成员域偏移量

    //C语言中结构体中的成员域偏移量 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...

  8. c语言结构体中的冒号的用法

    结构体中常见的冒号的用法是表示位域. 有些信息在存储时,并不需要占用一个完整的字节,   而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1   两种状态,   用一位二进位即可.为了节省 ...

  9. enginefuncs_t 结构体中的函数

    就是常见的 g_engfuncs 中的函数.AMXX 里就是 fakemeta 的 EngFunc_** // 这些函数由引擎提供给EXTDLL使用.mp.dll hl.dll ... typedef ...

随机推荐

  1. Ubuntu 12.04 分区方案(仅供参考)

    Ubuntu 12.04 分区方案(仅供参考)   总空间大小:50G 目录 建议大小 实际大小 格式 描述 / 10G~20G 10G ext4 根目录 swap <2048M 1G swap ...

  2. 基于 OAuth 安全协议的 Java 应用编程1

    原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-oauth/index.html 參考博客:http://www.cnblogs.com/wan ...

  3. Cookie中用户登录信息登录验证

    public class FormServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpSer ...

  4. ArcPy 函数列表(按字母顺序)

    Function name Category AddError Messages and error handling AddFieldDelimiters Fields AddIDMessage M ...

  5. 安卓UI美化_drawable

    UI美化 drawable资源 ------------------------------------------state drawable资源在不同状态下显示不同的图片在<selector ...

  6. php测试oracle链接是否成功

    $conn = oci_connect('eoffice', 'hdujiedian', '//192.168.100.21/hziee'); if (!$conn) { $e = oci_error ...

  7. PHP 概述 特点 基础语法

    PHP是什么 http://php.net/manual/zh/intro-whatis.php#intro-whatis  PHP(Hypertext Preprocessor,超文本预处理器)是一 ...

  8. .net System.TypeInitializationException 类型初始值设定项引发异常

    错误原因:静态字段连接数据库内容错误(应为Integrated Security=True) 果然解决! 来自:http://blog.csdn.net/zhang1597116/article/de ...

  9. magento 产品列表排序、分页功能

    我们以 catalog_category_layered 控制器为例说明 在catalog.xml 找到catalog_category_layered配置段 <catalog_category ...

  10. 利用javascript实现文本的自动输出

    主要利用了setTimeout(),递归和String.substring(); 做出的效果就像是有一个打字员在打字. <!doctype html> <html lang=&quo ...