函数指针数组可以基于某些条件选择要执行的函数,声明这种数组很简单,只要把函数指针声明为数组的类型即可,如下所示。这个数组的所有元素都被初始化为NULL
。如果数组的初始化值是一个语句块,系统会将块中的值赋给连续的数组元素。本例中只有一个值,我们会用这个值来初始化数组的所有元素。
typedef int (*operation)(int, int);
operation operations[128] = {NULL};
也可以不用typedef
来声明这个数组,如下:
int (*operations[128])(int, int) = {NULL};
这个数组的目的是可以用一个字符索引选择对应的函数来执行。比如,如果存在*
字符就表示乘法函数,我们可以用字符作为索引是因为字符字面量其实是整数,128个元素对应前128个ASCII字符。我们会把这个定义用在3.3.4节中实现的add
、sub
函数上。
数组初始化为NULL
后,我们把add
和sub
函数赋给加号和减号对应的元素:
void initializeOperationsArray() {
operations['+'] = add;
operations['-'] = subtract;
}
将前面的evaluate
函数改写为evaluateArray
。接下来我们用操作字符作为索引来使用operations
,而不是调用select
函数来获取函数指针。
int evaluateArray(char opcode, int num1, int num2) {
fptrOperation operation;
operation = operations[opcode];
return operation(num1, num2);
}
用下面的代码测试这些函数:
initializeOperationsArray();
printf("%d\n",evaluateArray('+', 5, 6));
printf("%d\n",evaluateArray('-', 5, 6));
执行结果是11和-1。更健壮的evaluateArray
函数版本需要在执行函数之前检查空指针。