您的位置:首页 > 编程语言 > C语言/C++

C语言中的函数类型和函数指针

2013-05-21 09:44 169 查看




#include <stdio.h>
#include <string.h>
 
void func1()
{
    printf("Func1 is runing...\n");
}
 
void func2()
{
    printf("Func2 is runing...\n");
}
 
void func3()
{
    printf("Func3 is runing...\n");
}
 
void func4()
{
    printf("Func4 is runing...\n");
}
 
void Temp_function() { printf("\nPlease input 1-4 to select test!!!\n"); }
 
struct                  //结构体数组
{
    void (*fun)(void);  // 函数指针
    char *tip;          // 字符串
}CmdTip[] = {
                { Temp_function, "Please input 1-4 to select test" } ,
                { func1, "Fun1" } ,
                { func2, "Fun2" } ,
                { func3, "Fun3" } ,
                { func4, "Fun4" } ,
                { 0, 0}
            };
 
int main()
{
    int i;
    while(1)
    {
        unsigned char idx;
 
        printf("\nPlease select function : \n");
        for(i=0; CmdTip[i].fun!=0; i++)
            printf("%d : %s\n", i, CmdTip[i].tip);
        scanf("%hhu", &idx);
//      printf("idx=%d; i=%d", idx, i);
        if(idx<i)
            (*CmdTip[idx].fun)();
 
    }
    return 0;
}


回调函数的使用范例:

#include <stdio.h>

typedef int(*FUNCTION)(int);

int g(int n, FUNCTION f)
{
    int i = 0;
    int ret = 0;
    
    for(i=1; i<=n; i++)
    {
        ret += i*f(i);
    }
    
    return ret;
}

int f1(int x)
{
    return x + 1;
}

int f2(int x)
{
    return 2*x - 1;
}

int f3(int x)
{
    return -x;
}

int main()
{
    printf("x * f1(x): %d\n", g(3, f1));
    printf("x * f2(x): %d\n", g(3, f2));
    printf("x * f3(x): %d\n", g(3, f3));
}


实例分析(u-boot-2009.11/lib_arm/bootm.c):

//实例分析(u-boot-2009.11/lib_arm/bootm.c)
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
{
	bd_t	*bd = gd->bd;
	char	*s;
	int	machid = bd->bi_arch_number;

	// 声明一个函数指针 是第二图中 直接直接定义的一种
	void	(*theKernel)(int zero, int arch, uint params);

	if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
		return 1;

	// 为这个函数指针赋值 将images->ep强制转化为函数类型
	theKernel = (void (*)(int, int, uint))images->ep;

	cleanup_before_linux ();

	// 调用这个函数 另一种方法:(*theKernel) (0, machid, bd->bi_boot_params);
	theKernel (0, machid, bd->bi_boot_params);
	/* does not return */

	return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐