C语言复习第五章:函数指针

希望写一篇来把函数指针的内容回顾一下

  1. 函数的指针的两种定义方法及三种使用方法

int myfun(int a,char b)
{
    printf("int myfunc\n");
    return 0;
}

int test01()
{
    //函数指针写法一
    typedef int(TYPE_FUN)(int,char);
    TYPE_FUN *f = myfun;
    //三种用法
    f(10,'a');
    (*f)(20,'b');
    myfun(30,'c');

    //函数指针写法二
    int (*f2)(int,char) = NULL;
    f2 = myfun;
    f2(40,'d');
}
  1. 函数指针数组的使用方法

int fun01()
{
    printf("fun01()");
}

int fun02()
{
    printf("fun02()");
}

int fun03()
{
    printf("fun03()");
}
//函数指针数组
int test02()
{
    int i;
    int (*fun_array[3])();
    /* 换成void类型void value not ignored as it ought to be*/
    fun_array[0] = fun01();
    fun_array[1] = fun02();
    fun_array[2] = fun03();

    for(i = 0;i < 3;i++)
    {
        fun_array[i]();
    }

    return 0;
}
  1. 函数指针做参数 打印数组元素
//函数指针做参数 回调函数
void printfall(void *a,int elsesize,int size,void(*print)(void *))
{
    char *a1 = (char*)a;
    int i ;
    for(i = 0;i < size;i++)
    {
        printf("%d\n",a + i*elsesize);//与原数组地址做对比
        print(a + i*elsesize);//调用myprint函数,打印出数组元素
    }
}

void myprintf(void *a)
{
    int *a2 = (int *)a;
    printf("%d\n",*a2);
}

void test03()
{
    int i;
    int a[] = {1,2,3,4,5};
    printfall(a,sizeof(int),sizeof(a)/sizeof(int),myprintf);
/* 打印数组各元素地址
    printf("--------------------\n");

    for(i = 0;i < 5;i++)
    {
        printf("%d\n",&a[i]);
    }
*/
}
  1. 做参数,打印出结构体数组元素

typedef struct person
{
    char name[64];
    int age;
}person;

void printfalls(void *a,int elsesize,int size,void(*print)(void *))
{
    char *a1 = (char*)a;
    int i;
    for(i = 0;i < size;i++)
    {
        char *pers = a1+i*elsesize;
        print(pers);
    }
}


void myprintfs(void*per)
{
    person *p = (person*)per;
    printf("name:%s,age:%d\n",p->name,p->age);
}

void test04()
{
    int i;
    person per[] =
    {
        {"aaa",64},
        {"bbb",65},
        {"ccc",66},
    };
/*
    for(i = 0;i < 3;i++)
    {
        printf("%d\n",&per[i]);
    }
*/
    printfalls(per,sizeof(person),sizeof(per)/sizeof(person),myprintfs);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值