C语言中的函数指针非常有用,我们能借助函数指针实现很多高级应用,这里我们简单介绍一下。
通过函数指针可以实现函数回调,下面是一个例子。
#include <stdio.h>
void callback(int i, void (*f)(int));
void repeat(int i);
int main(void)
{
callback(3, repeat);
return 0;
}
void callback(int i, void (*f)(int))
{
f(i);
}
void repeat(int i)
{
for(int j = 0; j < 3; j++)
{
printf("%d\n", i);
}
}
要处理可变参数,需要用C到标准库的va_list
类型和va_start
、va_arg
、va_end
宏,这些定义在stdarg.h
头文件中。下面是一个可变参数例子。
#include <stdio.h>
#include <stdarg.h>
void print_list(int begin, ...);
int main(void)
{
print_list(0, "hello", "world", "!", NULL);
return 0;
}
void print_list(int begin, ...)
{
va_list ap;
char *p;
va_start(ap, begin);
p = va_arg(ap, char*);
while(p != NULL)
{
printf("%s\n", p);
p = va_arg(ap, char*);
}
va_end(ap);
}
va_list ap
其实是一个指针,va_start(ap, begin)
使ap
指向begin
参数的下一个参数,然后va_arg(ap, char*)
把第二个参数的值按char*
型取出来,同时使ap
指向第三个参数,然后va_arg(ap, char *)
第三个参数的值按char *
型取出来,同时使ap
指向更高的地址。va_end(ap)
在有些实现中可能会把ap
改写成无效值,C标准要求在函数返回前调用va_end
。