关闭

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

381人阅读 评论(0) 收藏 举报
分类:

函数指针的用法

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};里面放的就是多个具体实现的操作

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:47627次
    • 积分:1297
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:12篇
    • 译文:17篇
    • 评论:1条