Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128649
  • 博文数量: 55
  • 博客积分: 1870
  • 博客等级: 上尉
  • 技术积分: 540
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-21 20:51
文章分类

全部博文(55)

文章存档

2011年(27)

2009年(3)

2008年(25)

我的朋友

分类: LINUX

2008-03-30 20:09:15

      看了一下午的函数指针,终于有点理解了。刚开始的时候只是对函数指针的概念有个印象,但不知道他到底有什么用处,现在我的理解是为了一些函数的通用性而采取的一种有效的措施。为什么这么说呢,看了下面的程序大家就应该明白了。

main()
{
    int max(int,int);  //函数声明
    int min(int,int);  //函数声明
    int add(int,int);  //函数声明
    int process(int ,int ,int(*fun));
    int a,b;

    printf("enter a and b:");
    scanf("%d ,%d",&a,&b);

    printf("max=");
    process(a,b,max);

    printf("min=");
    process(a,b,min);
    
    process("sum=");
    process(a,b,add);
}

max(int x,int y)
{
    int z;
    if(x>y) z=x;
    else z=y;
    return (z);
}

min(int x, int y)
{
    int z;
    if(x<y)z=x;
    else z=y;
    return(z);
}

add(int x,int y)
{
    int z=x+y;
    return(z);
}

process(int x,int y,int (*fun)(int,int))
{
    int result;
    result=(*fun)(x,y);
    printf("%d\n", result);
}

      从这个函数大家可以体会到什么呢?我能体会到的就是“通用性”,这个“通用性”指的就是有一个“通用函数”process,通过他,我们可以引用其他子函数(min,max,add)达到不同的目的;可能大家觉得直接应用函数也可以达到这个目的,为什么要通过一个“通用函数”来实现呢?我刚开始也有这个疑问,不过当我遇到下面问题以后,我就知道答案了。
      问题:前端模块传给我数据,输入参数为 char* buffer和 int length,buffer是数据的首地址,length表示这批数据的长度。数据的特点是:长度不定,类型不定,由第一个字节(buffer[0])标识该数据的类型,共有256种可能性。我的任务是必须对每一种可能出现的数据类型都要作处理,并且我的模块包含若干个函数,在每个函数里面都要作类似的处理。
通常我们的处理方法如下:

void function( char* buffer, int length )
{
          int stream_type = buffer[0];

        switch(stream_type){
              case 0:
                  function1();
                break;
              case 1:
                  ......
                case 255:
                  function255();
                break;
             }
}

      那么,如果我把上面的函数用函数指针来处理,又会是什么效果呢,大家请看下面:
首先定义256个处理函数(及其实现)。

void funtion0( void );
……
void funtion255(void );


其次定义函数指针数组,并给数组赋值。

void (*fun[256])(void);

fun[0] = function0;
……
fun[255] = function();



最后,function()函数可以修改如下

void funtion( char* buffer, int length )
{
    int stream_type = buffer[0];
    (*fun[stream_type])();
}

      简练的两条语句就把问题解决了,这回大家应该能体会到指针函数的优势了吧。函数指针就是利用了指针作为参数传递到其他函数这种最常用的方式实现的。因此,又一次体现了函数指针的灵活性。

总结:
      一个函数在编译时被分配给一个入口地址。这个入口地址就称为函数的指针。可以用一个函数变量指向函数,然后通过该指针变量调用此函数,这就是函数指针的定义。
      对于上面的例程,还有一点需要注意,正确使用函数指针数组的前提条件是,这若干个需要通过函数指针数组保存的函数必须有相同的输入、输出值。

阅读(579) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~