30、指针进阶2:指针与函数的高级应用
大约 4 分钟C语言基础程序程序厨
本文我们继续深入理解指针,继续介绍指针搭配函数的高级应用。
函数指针的定义与使用
函数指针的类型与声明
函数指针是一种指向函数的指针。每个函数都有一个唯一的入口地址,函数指针就是存储这个地址的变量。
函数指针的类型由它所指向的函数的返回类型和参数类型决定。
声明一个函数指针的语法如下:
返回类型 (*指针名)(参数类型列表);
例如,声明一个指向返回int
类型、接受两个int
类型参数的函数的指针:
int (*funcPtr)(int, int);
函数指针作为参数与返回值
函数指针可以作为函数的参数,允许函数在运行时决定调用哪个函数。同样,函数也可以返回函数指针,允许动态地选择函数行为。
示例代码
#include <stdio.h>
// 声明一个函数,它接受两个int类型参数并返回它们的和
int add(int a, int b) {
return a + b;
}
// 定义一个类型,表示接受两个int参数并返回int的函数指针
typedef int (*OperationFunc)(int, int);
// 声明一个函数,它接受一个函数指针和两个int类型参数,并调用该函数指针
int operate(OperationFunc func, int a, int b) {
return func(a, b);
}
// 声明一个返回函数指针的函数,根据输入返回不同的函数指针
OperationFunc getFunctionPtr(char op) {
if (op == '+') {
return add;
}
// 这里可以添加更多的条件来返回不同的函数指针
return NULL; // 默认返回NULL
}
int main() {
int a = 5, b = 3;
// 使用函数指针作为参数
int result = operate(add, a, b);
printf("Result of add: %d\n", result);
// 使用返回函数指针的函数
OperationFunc funcPtr = getFunctionPtr('+');
if (funcPtr != NULL) {
result = funcPtr(a, b);
printf("Result from getFunctionPtr: %d\n", result);
} else {
printf("Invalid operation\n");
}
return 0;
}
推荐阅读:函数指针&指针函数
回调函数与高阶函数
回调函数的概念与应用
回调函数是指作为参数传递给另一个函数的函数。在调用时,这个“被传递”的函数(即回调函数)会在某个特定条件下被“回调”(即执行)。回调函数允许程序在运行时动态地决定要执行的代码,从而提高了程序的灵活性,满足了更多需求。
高阶函数的实现与用途
高阶函数是指接受函数作为参数或返回函数的函数。高阶函数在函数式编程中非常常见,但在C语言中也可以通过函数指针来实现。
示例代码
#include <stdio.h>
// 声明一个回调函数类型
typedef int (*CallbackFunc)(int);
// 定义一个高阶函数,它接受一个回调函数和一个整数参数,并调用回调函数
int process(CallbackFunc callback, int value) {
return callback(value);
}
// 定义几个回调函数
int square(int x) {
return x * x;
}
int cube(int x) {
return x * x * x;
}
int main() {
int num = 5;
// 使用高阶函数和回调函数
int result1 = process(square, num);
printf("Square of %d: %d\n", num, result1);
int result2 = process(cube, num);
printf("Cube of %d: %d\n", num, result2);
return 0;
}
推荐阅读:回调函数
指针数组与函数指针数组
指针数组的定义与用途
指针数组是一个数组,其元素是指针。指针数组可以用来存储多个指向不同类型数据的指针,也可以用来存储多个指向相同类型数据的指针(如字符串数组)。
函数指针数组与函数表
函数指针数组是一个数组,其元素是指向函数的指针。函数指针数组可以用来实现函数表(也称为函数指针表),允许程序在运行时根据索引或条件选择并调用不同的函数。
示例代码
#include <stdio.h>
// 声明几个函数
void func1() {
printf("Function 1\n");
}
void func2() {
printf("Function 2\n");
}
void func3() {
printf("Function 3\n");
}
// 声明一个函数指针数组类型
typedef void (*FuncPtr)();
int main() {
// 定义并初始化一个函数指针数组
FuncPtr funcTable[] = {func1, func2, func3};
// 通过函数指针数组调用函数
for (int i = 0; i < 3; i++) {
funcTable[i]();
}
return 0;
}
通过深入理解这些指针的高级应用,你肯定可以编写更灵活的程序。
