函数指针是一种在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;
}
相关推荐
C语言函数指针是C语言中一个重要的组成部分,使用函数指针编程有以下优点: 1. 提高程序的编译效率和执行速度。 2. 通过函数指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。 3. ...
在C语言中,函数指针和指针函数是高级特性,它们在编程中扮演着重要角色,尤其是在处理回调函数、动态调度以及实现元编程等方面。本训练将深入讲解这两个概念,帮助你掌握其核心概念和实际应用。 首先,我们要了解...
### C语言中关于函数指针的用法 在C语言中,函数指针是一种非常强大的特性,它允许程序员将函数当作参数传递给其他函数或在运行时决定调用哪个函数,这种灵活性对于实现某些高级算法(如排序算法中的比较函数)至关...
总结,理解C语言的函数定义、声明和调用方法是编写高效程序的关键。函数帮助我们将代码组织成可重用的部分,参数传递允许我们在函数之间交换数据,而数组作为参数则允许我们处理集合数据。通过熟练掌握这些概念,你...
例如,要实现一个通用的积分计算函数,其中积分的具体方法可以通过函数指针传递进来: ```c // 定义积分函数 double integrate(double (*f)(double), double a, double b, int n) { double sum = 0.0; double dx =...
- **函数指针**:可以存储函数地址的变量,使得函数可以作为参数传递或作为其他函数的返回值。 4. **指针**: - 指针是C语言的一大特色,它存储了一个变量的内存地址。 - 指针的声明、初始化和解引用是学习的...
下面将详细讲解函数指针的概念、定义方式、使用方法以及示例。 1. **函数指针的概念** 函数指针本质上是一个变量,它存储的是函数在内存中的地址,当我们通过函数指针调用函数时,实际上是在访问该地址上的代码。...
本资源“C语言函数大全”包含了丰富的函数例题,旨在帮助学习者深入理解和熟练掌握C语言中的函数用法。下面我们将详细讨论C语言中的函数概念、类型以及其在实际编程中的应用。 首先,C语言中的函数可以分为内置...
C语言是一种广泛使用的编程语言,它...以上知识是C语言函数的基本概念,通过“C函数库”压缩包中的文档,你可以找到更详细的函数用法、示例和注意事项。深入理解并熟练运用这些知识点,将有助于提升你的C语言编程能力。
通过阅读并理解"C语言函数大全.pdf"这份文档,初学者可以全面掌握C语言函数的使用方法,进阶者则可以找到更高级的使用技巧,如函数指针、内存管理等。无论你是编程新手还是经验丰富的开发者,深入理解并熟练运用...
此外,查询结果可能包括函数的原型、描述、参数解释和返回值等关键信息,帮助用户理解函数的使用方法和适用场景。 C语言的函数还有其他一些特性,如递归调用(函数调用自身)、匿名函数(lambda表达式,C99标准引入...
在给定的代码中,有几种不同的函数指针用法: 1. **函数指针作为其他函数的参数** 这是最常见的用法。例如,`calculator1`函数接受两个整数`x`和`y`以及一个函数指针`pfunc`。`pfunc`是一个指向接受两个整数并返回...
这个“C语言函数大全及课件”资源包对于初学者来说是一份极佳的学习材料,涵盖了C语言的基础到高级知识,包括各种函数的用法。下面我们将深入探讨C语言中的重要知识点,并结合课件学习的要点进行解析。 一、C语言...
《C语言函数速查手册》是一本专门为C语言学习者和开发者设计的实用参考资料,它提供了C语言中各种函数的详细信息,旨在帮助用户快速查找和理解特定函数的使用方法。作为C语言的核心组成部分,函数在编程过程中起着至...
c语言利用指针求数组的最大值与最小值,下载资源,数组可扩展。
根据提供的文件信息,这里主要涉及的是《C语言函数大全》这本书的相关内容,虽然部分信息较为有限,但可以基于这些信息来展开对C语言函数的重要性和使用方法等方面的知识点。 ### C语言函数大全 #### 一、C语言...
本文将详细介绍C语言中指针的概念、使用方法,以及如何快速掌握这一重要知识点。 首先,我们需要了解指针的定义。在C语言中,指针是一种特殊的数据类型,它存储的是另一个变量的内存地址。通过指针,我们可以直接...
总之,掌握C语言的指针用法对于编写高效、灵活的代码至关重要。通过深入理解指针的概念、类型和应用,程序员可以更好地操控内存,创建复杂的数据结构,优化算法,以及解决实际问题。然而,同时也需要注意潜在的风险...
- 通过函数指针调用函数,我们需要使用括号`()`,就像调用函数一样,但是用指针来代替函数名: ```c int result = (*func_ptr)(arg1, arg2); ``` - 这里`(*func_ptr)`先解引用得到函数地址,然后使用括号调用该...
在《C语言函数速查手册》中,读者可以找到上述各种函数特性的详细解释,以及大量的示例代码,帮助开发者快速定位并理解各种函数的用法,提高编程效率。对于初学者和经验丰富的程序员来说,这都是一份宝贵的资源。