内存可以视为一个线性数组。如果一个变量保存的值是内存数组的索引(值),这样的变量称为指针。【许多C语言的书中,似乎说指针是特殊类型的通称,即指针类型,如同数组是int[]、char[]等等的通称;谭C的指针是指指针变量的值即一个内存数组的索引、一个地址。K&R指指针变量。】
函数指针(Function Pointers),也是一个指针变量,保存一个函数在内存中的入口地址。
#include <stdio.h> int Plus (int a, int b) { return a+b; } int Minus (int a, int b) { return a-b; } int Multiply(int a, int b) { return a*b; } int Divide (int a, int b) { return a/b; } /* *switch-statement:op决定执行哪一种操作 */ void Switch(int a, int b, char op){ int result=0; switch(op){ case '+' : result = Plus (a, b); break; case '-' : result = Minus (a, b); break; case '*' : result = Multiply (a, b); break; case '/' : result = Divide (a, b); break; } printf("Switch: %d %c %d = %d\n",a,op,b,result); } int main(void){ Switch(2,3,'+'); return 0; }我们编写Switch函数的替代品:以 函数指针pt2Func为参数。
void Switch_With_Function_Pointer(int a, int b, int (*pt2Func)(int, int)){ int result = pt2Func(a, b); // call using function pointer printf("Switch_With_Function_Pointer: %p (%d ,%d) = %d\n",pt2Func,a,b,result); } int main(void){ Switch(2,3,'+'); Switch_With_Function_Pointer(2, 5, &Minus);// Pass a Function Pointer as an Argument return 0; }输出:
#include <stdlib.h> // qsort #include <time.h> // randomize #include <stdio.h> // printf #define ARRAY_SIZE 10 int CmpFunc(const void* _a, const void* _b){ const float* a = (const float*) _a; const float* b = (const float*) _b; return (*a > *b)? 1: (*a == *b)? 0:-1; } void QSortDemo(void){ float field[ARRAY_SIZE]; time_t t; srand((unsigned) time(&t)); for(int c=0;c<ARRAY_SIZE;c++) // randomize all elements of the field field[c]=rand(); qsort((void*) field, /*number of items*/ ARRAY_SIZE, /*size of an item*/ sizeof(field[0]), /*comparison-function*/ CmpFunc); printf("the sorted field are ...\n"); for(int c=0;c<ARRAY_SIZE;c++) printf("element #%d contains %.0f\n", c, field[c]); printf("\n"); }
//Return a Function Pointer int (*GetPtr(const char op))(int, int){ return '+'==op ? &Plus : &Minus; } void QSortDemo(void); int main(void){ int (*pt2Func)(int, int) = NULL; pt2Func = GetPtr('+'); int result2 = (*pt2Func) (2,3); printf("result2 = %d\n",result2); QSortDemo(); return 0; }