C 语言中的高阶函数
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
C 语言中的函数指针,很容易实现一个高阶函数。我们还以 map 为例,说明在 C 语言中如何实现:
//prototype of function
void map(int* array, int length, int (*func)(int));
map 函数的第三个参数为一个函数指针,接受一个整型的参数,返回一个整型参数,我们来看看其实现:
//implement of function map
void map(int* array, int length, int (*func)(int)){
int i = 0;
for(i = 0; i < length; i++){
array[i] = func(array[i]);
}
}
我们在这里实现两个小函数,分别计算传入参数的乘 2 的值,和乘 3 的值,然后进行测试:
int twice(int num) { return num * 2; }
int triple(int num){ return num * 3; }
//function main
int main(int argc, char** argv){
int array[5] = {1, 2, 3, 4, 5};
int i = 0;
int len = 5;
//print the orignal array
printArray(array, len);
//mapped by twice
map(array, len, twice);
printArray(array, len);
//mapped by twice, then triple
map(array, len, triple);
printArray(array, len);
return 0;
}
运行结果如下:
1 2 3 4 5
2 4 6 8 10
6 12 18 24 30
应该注意的是 map 的使用方法,如 map(array, len, twice)中,最后的参数为 twice,而 twice 为一个函数。因为 C 语言中,函数的定义不能嵌套,因此不能采用诸如 JavaScript 中的匿名函数那样的简洁写法。
虽然在 C 语言中可以通过函数指针的方式来实现高阶函数,但是随着高阶函数的“阶” 的增高,指针层次势必要跟着变得很复杂,那样会增加代码的复杂度,而且由于 C 语言是 强类型的,因此在数据类型方面必然有很大的限制。
在线练习
{$ activeFileHint $}