介绍
直接上代码
#include <stdio.h>
void f(void)
{
static int times = 0;
printf("invoke %d\n", ++times);
}
int main(void)
{
void (*pf)(void) = f;
printf("f = %p\n", f);
printf("*f = %p\n", *f);
printf("&f = %p\n\n", &f);
printf("pf = %p\n", pf);
printf("*pf = %p\n", *pf);
f();//line 1
(*f)();//line 2
(&f)();//line 3
pf();//line 4
(*pf)();//line 5
getchar();
return 0;
}
运行结果:
- f、&f、&f, 都是函数的入口地址。
- 函数的调用有5种方式,f()、(*f)()、(&f)()、pf()、(*pf)()。
- *pf对指针pf解引用,,理论上说得到的是函数名,但是编译器会把它转换成指针,见图2:00B83CDC call dword ptr [pf] 。
用途
函数指针主要有两个用途:作为参数传递给另一个函数(回调函数)、转换表(不讨论)。
回调函数:编写sort函数,它用于对任何类型的数组进行排序。
sort函数原型:void sort(void array, int count, int size, int (*comp)(void , void *));
sort.c
#include<stddef.h>
#include<assert.h>
static void swap(char *i, char *j, int size)
{
char temp;
while (size-- != 0)
{
temp = *i;
*i++ = *j;
*j++ = temp;
}
}
void sort(void *array, int count, int size, int (*comp)(void *, void *))
{
char *i, *j, *last;
assert(count > 0 && size > 0);
last = (char *)array + size * (count - 1);
for (i = array; i < last; i += size)
for (j = i + size; j <= last; j += size)
if (comp(i, j) > 0)
swap(i, j, size);
}
main.c
#include <stdio.h>
void sort(void *array, int count, int size, int (*comp)(void *, void *));
int comp(void *i, void *j)
{
int *p1 = i;
int *p2 = j;
return *p1 > *p2 ? 1 : *p1 < *p2 ? -1 : 0;
}
int main(void)
{
int arr[] = { 10, 9, 7, 4, 2, 1, 8, 3, 5, 6 };
sort(arr, sizeof(arr) / sizeof(int), sizeof(int), comp);
for (int i = 0; i < 10; i++)
printf("%d\n", arr[i]);
getchar();
return 0;
}