回到正題,函式指標到底可以多好用?先從最基本的開始吧!
int add(int x, int y) { return x+y; } int sub(int x, int y) { return x-y; } int main(void) { int (*pfunc)(int, int); pfunc = add; printf("sum = %d\n", pfunc(3, 2)); pfunc = sub; printf("dif = %d\n", pfunc(3, 2)); return 0; }
上面其實不算什麼應用,只是用來說明函式指標的用法,和直接使用 add 和 sub 函式沒有什麼差別。再看底下的例子:
int add(int x, int y) { return x+y; } int sub(int x, int y) { return x-y; } int calc(int (*pfunc)(int, int), int x, int y) { return pfunc(x, y); } int main(void) { printf("sum = %d\n", calc(add, 4, 2)); printf("dif = %d\n", calc(sub, 4, 2)); return 0; }
藉由 calc 這個函式,它把 int (*pfunc)(int, int) 當做參數,讓 add 和 sub 可以直接傳給 calc,讓它做你要它做的事。
int add(int x, int y) { return x+y; } int sub(int x, int y) { return x-y; } int mul(int x, int y) { return x*y; } int div(int x, int y) { return x/y; } enum op_type { ADD, SUB, MUL, DIV }; typedef struct { char *op_name; int x; int y; enum op_type op; } parameters; int(*perform_feature[])(int, int) = {add, sub, mul, div};
int main(void)
{
int i;
parameters p[] = {
{"sum", 4, 2, ADD},
{"dif", 4, 2, SUB},
{"pro", 4, 2, MUL},
{"quo", 4, 2, DIV},
};
for (i=0;i<(int)(sizeof(p)/sizeof(parameters));i++)
printf("%s = %d\n", p[i].op_name, (perform_feature[p[i].op])(p[i].x, p[i].y));
return 0;
}
最後這個例子因為 for 迴圈無法用 code 的方式顯示,所以直接貼上。在這裡加上陣列的使用,讓函式直接利用索引來執行,這樣的好處是,不管我新增了多少新的函式到 perform_feature 裡,都不用改 for 迴圈。
這裡的例子只是一小部份應用,如何能應用到你的程式裡,就要靠你的設計能力了。
沒有留言:
張貼留言