C语言-函数指针的使用

在C语言中,函数指针是指向函数的指针变量。它可以存储函数的地址,使得可以通过该指针来调用函数。

一、基本概念

1、声明函数指针

returnType (*pointerName)(parameterTypes);

 这里returnType是函数返回类型,parameterTypes是函数参数类型。例如:

int (*add)(int, int); // 声明一个函数指针,指向接受两个int参数并返回int的函数。

 2、初始化函数指针

add = ∑ // sum是一个函数,将其地址赋给add指针。

 或者更简洁的用法:

add = sum; // &可以省略

 二、用法示例

#include <stdio.h>
 
// 一个简单的函数
int sum(int a, int b) {
    return a + b;
}
 
int main() {
    // 定义一个函数指针并初始化
    int (*add)(int, int) = sum;
 
    // 使用函数指针调用函数
    int result = add(3, 4);
 
    // 打印结果
    printf("Result: %d\n", result);
 
    return 0;
}

在本例子中,add是一个指向接受两个证书参数并返回整数的函数的指针。它被初始化为指向sum函数。之后,通过add(3,4)调用了sum函数,结果被打印出来。

三、函数指针的用途

1、回调函数:允许传递函数作为参数,常用于实现回调机制,即将函数作为一个参数传递给另一个函数,使得在某个事件发生时调用这个函数。

#include <stdio.h>
 
// 回调函数
void callbackFunction(int value) {
    printf("Callback: %d\n", value);
}
 
// 接受回调函数作为参数的函数
void performOperation(int x, int y, void (*callback)(int)) {
    int result = x + y;
    callback(result);
}
 
int main() {
    // 使用回调函数
    performOperation(3, 4, callbackFunction);
 
    return 0;
}

2、动态函数调用:通过函数指针,可以在运行时动态地选择调用哪个函数,这样可以根据某些条件选择不同的实现。

#include <stdio.h>
 
int add(int a, int b) {
    return a + b;
}
 
int subtract(int a, int b) {
    return a - b;
}
 
int main() {
    int (*operation)(int, int);  // 声明一个函数指针
 
    // 根据条件选择函数
    int condition = 1;
    if (condition == 1) {
        operation = add;
    } else {
        operation = subtract;
    }
 
    // 使用函数指针调用函数
    int result = operation(5, 3);
    printf("Result: %d\n", result);
 
    return 0;
}
#include<stdio.h>
 
int add(int x,int y)
{
	return x+y;
 } 
 
int subtract(int x,int y)
{
	return x-y;
}
 
int multiply(int x,int y)
{
	return x*y;
}
 
//指针做函数参数
int prosecc(int(*p)(int,int),int a,int b)
{
	int P;
	P = (*p)(a,b);
	return P;
	
}
 
int main(void)
{
	int num;
	num = prosecc(add,3,4);
	printf("Results: %d\r\n",num);
	
	
	num = prosecc(subtract,4,3);
	printf("Results: %d\r\n",num);
	
	num = prosecc(multiply,4,3);
	printf("Results: %d\r\n",num);
 
    return 0;
}

3、函数指针数组:可以创建存储函数指针的数组,实现类似分发器的功能,根据索引或条件选择调用不同的函数。

#include <stdio.h>
 
int add(int a, int b) {
    return a + b;
}
 
int subtract(int a, int b) {
    return a - b;
}
 
int multiply(int a, int b) {
    return a * b;
}
 
int main() {
    int (*operations[])(int, int) = {add, subtract, multiply};  // 函数指针数组
 
    // 使用函数指针数组调用不同的函数
    int result1 = operations[0](5, 3);  // 调用add
    int result2 = operations[1](5, 3);  // 调用subtract
    int result3 = operations[2](5, 3);  // 调用multiply
 
    printf("Results: %d, %d, %d\n", result1, result2, result3);
 
    return 0;
}

4、函数指针作为结构成员:可以将函数指针作为结构的一个成员,形成函数指针结构。

#include <stdio.h>
 
// 定义包含函数指针的结构
struct Operation {
    int (*operation)(int, int);
};
 
// 使用结构中的函数指针
int performOperation(struct Operation op, int a, int b) {
    return op.operation(a, b);
}
 
// 具体的函数实现
int add(int a, int b) {
    return a + b;
}
 
int main() {
    // 初始化结构并使用函数指针
    struct Operation addition = {add};
    int result = performOperation(addition, 3, 4);
 
    printf("Result: %d\n", result);
 
    return 0;
}

总的来说,函数指针是C语言中强大而灵活的特性,允许在运行时动态地选择调用哪个函数,从而提高代码的灵活性和可维护性。

四、函数指针的优缺点

1、优势

(1)实现回调函数;

可以将函数指针作为参数传递给其他函数,使得被调用的函数能够在特定的时刻执行回调函数,增加了程序的灵活性和可扩展性。

例如:信号以及线程的创建。

(2)动态选择函数

在运行时根据不同的条件决定调用哪个函数,而不需要在编译时就确定。

比如根据用户的输入或系统的状态来选择执行不同的功能函数。

(3)简化代码结构

可以将一组相关但略有不同的操作封装在不同的函数中,并通过函数指针来选择执行,使代码更具可读性和可维护性。

2、缺陷

(1)可读性和理解难度;

(2)容易出错

错误地操作函数指针,如传递错了函数地址、未正确初始化等,可能导致难以调试的运行时错误。

(3)代码复杂

过度使用函数指针可能使代码结构变得复杂,增加了代码的维护成本。

今日,在面试过程中,被面试官问到,如何使用function可调用对象包装器后,又追问除了可调用对象包装器以外还有什么方法可以执行这种操作?故整理了一下上述函数指针的一些具体用法以及优缺点。

此外,对于function可调用对象包装器的使用,个人觉得功能是远比函数指针的使用要强大的。

function和bind的结合使用,可以通过绑定器将资源与函数进行绑定,传递给function包装器对象;

但函数指针的使用,终归是指针指向了函数的这片地址空间,仍然需要将资源传递给函数。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值