希望写一篇来把函数指针的内容回顾一下
- 函数的指针的两种定义方法及三种使用方法
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');
}
- 函数指针数组的使用方法
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;
}
- 函数指针做参数 打印数组元素
//函数指针做参数 回调函数
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]);
}
*/
}
- 做参数,打印出结构体数组元素
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);
}