函数指针数组怎么用?5个实用场景与初始化方法分享


场景一:回调函数

函数指针数组在回调函数中非常有用。例如,你可以创建一个函数指针数组,每个指针指向一个不同的回调函数。然后,你可以根据用户的输入或其他条件动态地调用这些函数。

c

include

typedef void (callback_t)();

void function1() {

printf("Function 1 called");

}

void function2() {

printf("Function 2 called");

}

int main() {

callback_t callbacks[] = {function1, function2};

int choice = 1; // User input

if (choice == 1) {

callbacks[0]();

} else if (choice == 2) {

callbacks[1]();

}

return 0;

}

场景二:插件系统

在插件系统中,函数指针数组允许你动态地加载和调用插件函数。你可以创建一个函数指针数组,每个指针指向一个插件函数,然后在需要时调用它们。

c

include

typedef void (plugin_t)();

void plugin1() {

printf("Plugin 1 loaded");

}

void plugin2() {

printf("Plugin 2 loaded");

}

int main() {

plugin_t plugins[] = {plugin1, plugin2};

int choice = 1; // Plugin choice

if (choice == 1) {

plugins[0]();

} else if (choice == 2) {

plugins[1]();

}

return 0;

}

场景三:策略模式

在策略模式中,你可以使用函数指针数组来根据不同的策略动态地调用不同的函数。

c

include

typedef void (strategy_t)();

void strategyA() {

printf("Strategy A called");

}

void strategyB() {

printf("Strategy B called");

}

int main() {

strategy_t strategies[] = {strategyA, strategyB};

int choice = 1; // Strategy choice

if (choice == 1) {

strategies[0]();

} else if (choice == 2) {

strategies[1]();

}

return 0;

}

场景四:适配器模式

在适配器模式中,函数指针数组可以将不兼容的接口转换为兼容的接口。你可以创建一个函数指针数组,每个指针指向一个适配器函数,然后在需要时调用它们。

c

include

typedef void (adapter_t)(int);

void adapter1(int x) {

printf("Adapter 1 called with %d", x);

}

void adapter2(int x) {

printf("Adapter 2 called with %d", x);

}

int main() {

adapter_t adapters[] = {adapter1, adapter2};

int choice = 1; // Adapter choice

int x = 10; // Input

if (choice == 1) {

adapters[0](x);

} else if (choice == 2) {

adapters[1](x);

}

return 0;

}

场景五:动态任务

在需要动态任务的情况下,函数指针数组可以非常有用。你可以创建一个函数指针数组,每个指针指向一个不同的任务函数,然后根据需要调用它们。

c

include

typedef void (task_t)();

void task1() {

printf("Task 1 executed");

}

void task2() {

printf("Task 2 executed");

}

int main() {

task_t tasks[] = {task1, task2};

int choice = 1; // Task choice

if (choice == 1) {

tasks[0]();

} else if (choice == 2) {

tasks[1]();

}

return 0;

}

初始化方法

函数指针数组的初始化通常很简单,你只需要将每个函数指针设置为指向相应的函数即可。例如,对于上述示例,你可以直接在定义数组时初始化函数指针,如下所示:

c

callback_t callbacks[] = {function1, function2};

或者,你也可以在定义数组后单独初始化每个函数指针,如下所示:

c

callback_t callbacks[2];

callbacks[0] = function1;

callbacks[1] = function2;

请注意,函数指针数组的大小必须足够大,以容纳你计划存储的函数指针。在上述示例中,我们假设有两个函数,所以数组大小为2。如果你的函数指针数组需要存储更多的函数指针,你需要相应地增加数组的大小。