高级函数应用

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_startva_argva_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

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap