c语言中函数指针的用法和技巧

原创 2013年12月05日 14:36:07

函数指针的用法

2.1基本概念int (*f)();

前一个括号迫使间接访问*f在函数被调用前进行。

程序中的每个函数都位于内存中的某个位置,所以存在指向那个位置的指针是完全可能的。

函数指针被声明后不指向任何值,在访问前必须把它初始化指向某个函数。

2.2 回调函数:查找函数与类型无关首先要做到改变比较的执行方式,使用函数指针可以解决类型的抽象化问题。调用者编写一个函数,用于比较两个值,然后把一个指向这个函数的指针作为参数传递给查找函数。然后查找函数调用这个函数来执行值的比较。然后要做到向函数传递的一个指向值的指针而不是值本身。函数有一个void*的形参用于接收这个参数。然后指向这个值的指针便传递给比较函数。这样可以比较不同类型的数据。

这就是回调函数,因为用户把一个函数作为参数传递给其他函数,后者将回调用户的函数。这里,在函数内部必须把void*强制转换为正确的类型。回调函数比较两个值。查找函数向比较函数传递两个指向需要进行比较的值的指针,并检查比较函数的返回值。这样,查找函数就与类型无关,因为它本身并不执行实际的比较。但是,调用者必须编写必须的比较函数。

大体结构为

#include <stdio.h>

 #include “node.h”

Node* Search_list(Node* node,void const *value,int(*compare)(void const*,void const*))

{

While(node!=NULL)

{

If(compare(&node->value,value)==0) break;

Node=node->link

}

Return node;

}

然后,在compare接口的约束下,实现比较整数的函数

Int compare_ints(void const* a,void const* b)

{If(*(int*)a==*(int*)b)  return 0;

Return 1;}

最后调用查找函数Desired_node=search_list(root,&desired_value,compare_ints)

 

2.3 讨论回调函数实现两个对象之间的通信。如果一个对象实时接受外界中断,状态处在不断的变化中,而其他对象依赖于该对象,需要根据该对象的变化来做出响应。如果直接用其他对象来调用该对象,则耦合太深,更改代码时不容易。因此采用回调函数的方法来通知其他对象该实时对象的状态发生了变化。即每个需要知道该状态的对象都注册一个该对象的回调函数。

用函数指针实现C语言的抽象接口编程:例如,如下为一个抽象的写操作,该写操作可以写local-L2,L2和DDR。

而写不同设备的方法是不同的,如果实现抽象化从而最大限度的复用代码呢?

首先设计一个写的抽象的接口函数Write,该接口函数读入一个id用来表示不同的存储器操作,在内部转发给不同的函数指针指向的对象。

1 int Write(int DevID, char* DataFrom, int StartDevAddr, int DataLong)

2 { return DevWrite[ DevID ]( char* DataFrom, int StartDevAddr, int DataLong );}

3 其中,DevWrite[ DevID ]就是一个函数指针数组:其定义为 int (*DevWrite)[ MAX_DEV_NUM ]( char*,int,int ) = {0};里面放的就是多个具体实现的操作

关于C语言中 || 和 &&的用法

||是逻辑或,例子如下 1 2 3 4 5 6 //表达式1||表达式2 //如果表达式1是true或者表达式2是true,...
  • Dy_1748204009
  • Dy_1748204009
  • 2016年12月13日 11:57
  • 4802

C语言中continue和break的用法

break和continue语句都可以用在循环中,用来跳出循环(结束循环);break语句还可以用在switch语句中,用来跳出switch语句。   int a; while (1...
  • u011032334
  • u011032334
  • 2014年12月04日 19:32
  • 2266

Java中实现类似于C语言的中函数指针的功能

1.什么是函数指针 如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配了一段存储空间,这段存储空间的起始地址(有称入口地址)称为这个函数的指针。可以定义一个指向函数的指针变量,用来存放某一...
  • chenkaibsw
  • chenkaibsw
  • 2018年01月05日 21:24
  • 38

C语言中#和##的用法

今天在学习Uboot的时候遇到cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage}这条语句。...
  • shy19910509
  • shy19910509
  • 2014年12月19日 17:03
  • 4229

c语言中break和continue的用法和区别

/* break与continue的的用法以及区别 1. 当它们用在循环语句的循环体时,break用于立即退出本层循环,而continue仅仅结束本次循环(本次循环体内不执行 continue...
  • u010259906
  • u010259906
  • 2015年08月01日 13:33
  • 8208

c语言中的if(){}的使用风格,哪种好呢

在使用if(){}这样的语句时一般有两种风格:第一种是:if(){}另一种是:if(){} 在linux下,如果你查看很多开源软件的代码,都会看到使用的是第二种风格,而我受林锐博士的影响使用的是第一种...
  • fjb2080
  • fjb2080
  • 2010年01月14日 10:07
  • 2019

c语言中的&的用法

c语言中的&,&&的用法
  • jackcily
  • jackcily
  • 2017年03月16日 23:04
  • 7690

C语言中 typeof()函数的用法

前言:     typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常广泛。 一,说明     typeof的参数可以是两种形式:表达式或类型。     1,...
  • wichace
  • wichace
  • 2015年07月08日 21:39
  • 1645

C语言中volatile的用法及意义

volatile 影响编译器编译的结果,volatile指出 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行...
  • u010879456
  • u010879456
  • 2016年12月17日 10:42
  • 372

C语言-函数指针与函数名的区别

记得大学时老师曾说函数的函数名是函数的入口的指针,之前看block通过clang编译生成的C代码发现很多函数指针,于是想了解函数指针与函数名有什么区别?以及函数指针一般都有些什么作用。 函数指针与函...
  • qq_30107991
  • qq_30107991
  • 2016年01月01日 11:39
  • 4042
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言中函数指针的用法和技巧
举报原因:
原因补充:

(最多只允许输入30个字)