http://zhedahht.blog.163.com/blog/static/25411174200741295930898/
文章中提到的第三点很好,CALLBACK函数很有启发意义:
在函数Reorder中,用函数指针func指向的函数来判断一个数字是不是符合给定的条件,而不是用在代码直接判断(hard code)。这样的好处是把调整顺序的算法和调整的标准分开了(即解耦,decouple)。当调整的标准改变时,Reorder的代码不需要修改,只需要提供一个新的确定调整标准的函数即可,提高了代码的可维护性。例如要求把负数放在非负数的前面,我们不需要修改Reorder的代码,只需添加一个函数来判断整数是不是非负数。这样的思路在很多库中都有广泛的应用,比如在STL的很多算法函数中都有一个仿函数(functor)的参数(当然仿函数不是函数指针,但其思想是一样的)。如果在面试中能够想到这一层,无疑能给面试官留下很好的印象。
#include <cstdio> typedef bool (*pFn)(int); bool is_even(int n) { return (n & 0x01) == 0; } void re_order(int *data, unsigned length, pFn func) { if (data == nullptr || length == 0) return; int *s = data; int *e = data + length - 1; while (s < e) { if (!func(*s)) { ++s; continue; } if (func(*e)) { --e; continue; } int t = *s; *s = *e; *e = t; } } int main() { const int len = 7; int arr[len+1] = {1, 2, 3, 4, 5, 6, 7}; re_order(arr, len, is_even); for (int i = 0; i < len; ++i) printf("%d ", arr[i]); return 0; }