`

C语言函数指针的用法

阅读更多

函数指针是一种在C、C++、D语言、其他类 C 语言和Fortran 2003中的指针。函数指针可以像一般函数一样,用于调用函数、传递参数。在如 C 这样的语言中,通过提供一个简单的选取、执行函数的方法,函数指针可以简化代码。

函数指针只能指向具有特定特征的函数。因而所有被同一指针运用的函数必须具有相同的参数和返回类型。

下面的代码说明了一种初始化函数指针的方法:

int f(int);
int (*fp)(int) = &f;

//使用三种方式调用函数
int ans;
ans = f(25);
ans = (*pf)(25);
ans = pf(25);
 以下为函数指针在C中的简单运用:
#include <stdio.h>

int max(int x, int y)
{
    return x > y ? x : y;
}
 
int main(void)
{
    /* p 是函数指针 */
    int (* p)(int, int) = & max; // &可以省略
    int a, b, c, d;
 
    printf("please input 3 numbers:");
    scanf("%d %d %d", & a, & b, & c);
 
    /* 与直接调用函数等价,d = max(max(a, b), c) */
    d = (* p)(( *p)(a, b), c); 
 
    printf("the maxumum number is: %d\n", d);
    return 0;
}
 下面介绍函数指针最常见的两个用途:作为参数传递给另一个函数(回调函数)、转换表
1、回调函数:

下面有一个简单的函数,用来在单链表中查找一个给定的值

Node* search_list(Node* node, int const value)
{
    while(node != NULL) {
        if(node->value == value)
            break;
        node = node->next;
    }
    return node;
}

 一种更加通用的方法就是使该函数能用任何类型值的链表,必须修改函数,使它与类型无关。解决的方案就是使用函数指针。

#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->next;
    }
    return node;
}

 在特定的链表中进行比较的时候,用户需要编写适当的比较函数,并把指向该函数的指针和指向需要查找的值的指针传递给查找函数,下面是一个整型链表中查找的比较函数:

int compare_ints(void const *a, void const *b)
{
    if( *(int *)a == *(int *)b)
        return 0;
    else
        return 1;
}

//这个函数将像下面这样调用
desired_node = search_list(root, &desired_value, compare_ints);
 如果你希望在一个字符串链表中进行查找,下面的代码可以完成任务:
#include<string.h>
...
desired_node = search_list(root, "desired_value", strcmp);
 再看一个完整的例子:
#include<stdio.h>
struct object
{
    int data;
};
 
int object_compare(struct object * a,struct object * z)
{
    return a->data < z->data ? 1 : 0;
}
 
struct object *maximum(struct object * begin,struct object * end,int (* compare)(struct object *, struct object *))
{
    struct object * result = begin;
    while(begin != end)
    {
        if(compare(result, begin))
        {
            result = begin;
        }
        ++ begin;
    }
    return result;
}
 
int main(void)
{
    struct object data[8] = {{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}};
    struct object * max;
    max = maximum(data + 0, data + 8, & object_compare);
    printf("max: %d\n", (*max).data);
    return 0;
}
 2、转移表

下面的程序是一个简化的根据运算符转到相应运算的例子:

#include<stdio.h>

double _add(double, double);
double _sub(double, double);
double _mul(double, double);
double _div(double, double);

double _add(double a, double b)
{
    return a + b;
}

double _sub(double a, double b)
{
    return a - b;
}

double _mul(double a, double b)
{
    return a * b;
}

double _div(double a, double b)
{
    return a / b;
}

int main(void)
{
    int n;
    enum Operation{ADD, SUB, MUL, DIV}op;
    double a, b, ans;
    a = 0.232332;
    b = 0.234398;
    printf("请输入一个整数(0-3): ");
    scanf("%d", &n);
    op = (enum Operation)n;
    switch(op) {
    case ADD:
        ans = _add(a, b);
        break;
    case SUB:
        ans = _sub(a, b);
        break;
    case MUL:
        ans = _mul(a, b);
        break;
    case DIV:
        ans = _div(a, b);
        break;
    default:
        break;
    }
    printf("%lf\n", ans);
    return 0;
}
 使用可以使用转换表来实现相同的任务,转换表就是一个函数指针数组,代码如下:
#include<stdio.h>
double _add(double, double);
double _sub(double, double);
double _mul(double, double);
double _div(double, double);

double _add(double a, double b)
{
    return a + b;
}

double _sub(double a, double b)
{
    return a - b;
}

double _mul(double a, double b)
{
    return a * b;
}

double _div(double a, double b)
{
    return a / b;
}

int main(void)
{
    int n;    double a, b, ans;
    a = 0.232332;
    b = 0.234398;
    printf("请输入一个整数(0-3): ");
    scanf("%d", &n);

    double (*oper_func[])(double, double) = {
        _add, _sub, _mul, _div
    };

    ans = oper_func[n](a, b);
    printf("%lf\n", ans);
    return 0;
}

 

 
1
1
分享到:
评论

相关推荐

    C语言中关于函数指针的用法

    C语言中关于函数指针的用法。。。。。。。。。。。。。

    C语言中用指针指向函数的方法及其高级处理技巧的研究与应用

    C语言中用指针指向函数的方法及其高级处理技巧的研究与应用,很好的东西!

    C语言指针、函数指针学习笔记.md

    通过学习可以全面掌握C语言中的指针知识,熟练使用指针与字符串、指针数组、动态内存分配和函数指针。 使用建议: 重点学习指针与动态内存分配,以及函数指针的使用。针对示例代码进行实践是一个好方法。本课件内容...

    c语言利用指针求数组的最大值与最小值

    c语言利用指针求数组的最大值与最小值,下载资源,数组可扩展。

    C语言函数指针的几种用法.pdf

    c语言.实验1 基本操作及调试.pdfc语言.实验1 基本操作及调试.pdf

    C语言函数指针

    函数指针,全范围的学习指针用法.

    C语言中函数指针的三种使用方法总结

    C语言中函数指针的三种使用方法总结 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正。写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能...

    c语言函数.doc )

    第6章+函数.doc 1. 掌握定义和调用函数的方法 2.掌握函数嵌套调用的方法 3.掌握通过“值传递”调用函数的...理解变量作用域和存在期的概念,掌握全局变量和局部变量,动态变量和静态变量的定义、说明和使用方法

    C语言中的函数指针学习笔记

    主要介绍了C语言中的函数指针的一些学习知识点记录,文中作者整理了一些比较interesting的函数指针用法,需要的朋友可以参考下

    描述一下C语言经典指针问答,并附带详细的解答举例说明.docx

    如果你是有经验的开发者,你将会从本文中学习到一些高级的指针用法,以及如何在项目中更加高效地使用指针。 在本文中,我们将首先介绍指针的基本概念。我们将解释什么是指针,为什么使用指针,以及如何声明和初始化...

    函数指针的定义及用法,详细

    在C语言中,函数指针的定义方式为: ```c 返回类型 (*指针变量名)(参数列表); ``` 例如,定义一个返回类型为int,参数列表为两个int类型的函数指针: ```c int (*pFunc)(int, int); ``` 可以通过赋值将一个函数...

    指向函数的指针的用法.rar_c 指针_c语言指针_指针

    经典的C语言编程(作者是C语言开发者Kernighan和Ritchie)

    C语言指针原理用法和代码

    一级二级指针,各种字符串函数用指针实现,传参,指针函数相关

    C语言中函数指针与软件设计经验总结

    函数指针与软件设计 记得刚开始工作时,一位高手告诉我,说,longjmp和setjmp玩得不熟,就不要自称为C语言高手。当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法。后来明白...

    C语言指针详细解读20180904.pptx

    自己编写的C语言指针培训教材。适用于公司内中级水平的嵌入式软件开发工程师。 内容包括:C语言指针的概念、用法、多级指针、函数指针等高级用法。

    C语言全套视频教程 视频.txt

    27) C语言之指针的简单用法 28) C语言之字符串指针详解 数组 29) C语言之定义数组 30) C语言之一维数组的使用 31) C语言之二维数组和多维数组 32) C语言之指向数组的指针 33) C语言之保护数组内容const的使用 34) ...

    剖析C++编程当中指针作为函数参数的用法

    在C语言中,函数指针变量常见的用途之一是作为函数的参数,将函数名传给其他函数的形参。这样就可以在调用一个函数的过程中根据给定的不同实参调用不同的函数。 例如,利用这种方法可以编写一个求定积分的通用函数,...

    自学去c语言视频教程

    27) C语言之指针的简单用法 28) C语言之字符串指针详解 数组 29) C语言之定义数组 30) C语言之一维数组的使用 31) C语言之二维数组和多维数组 32) C语言之指向数组的指针 33) C语言之保护数组内容const的使用 34) ...

    C语言指针完全指南.doc

    掌握指针的声明、定义和使用;掌握动态内存分配的方法;掌握指针及数组名之间的差别;掌握函数的值传递机制以及函数返回多值的方法。 2、预备知识 C语言普通变量的声明和使用,包括局部变量和全局变量的特点;C语言...

Global site tag (gtag.js) - Google Analytics