1.函数指针的两种定义方式及调用
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int main()
{
int(*p)(int a, int b) = NULL;//定义函数指针
int(*p1)(int, int) = NULL;//形参可以省略,定义函数指针
p = add;//指向
p1 = add;
int sum = (*p)(3, 4);//调用
int sum1 = p1(3, 4);//调用可以省略*,不过有些古老编译器不支持
printf("sum = %d,sum1 = %d\n", sum,sum1);
return 0;
}
2.使用 函数指针实现回调函数
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
void print(int(*p)(int, int), int a, int b)
{
printf("%d\n", p(a, b));
}
int main()
{
print(add, 1, 2);
print(sub, 4, 2);
void(*p1)(int(*p)(int, int), int, int);//函数指针
p1 = print;
p1(add, 1, 2);
p1(sub, 4, 2);
(*p1)(add, 1, 2);
(*p1)(sub, 4, 2);//复习上一步 都会打印出同样的数字
return 0;
}
3.利用typedef简化
#include <stdio.h>
typedef int(*func)(int, int);
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
//void print(int(*p)(int, int), int a, int b)
//{
// printf("%d\n", p(a, b));
//}
void print(func p, int a, int b)
{
printf("%d\n", p(a, b));
}
int main()
{
print(add, 1, 2);
print(sub, 4, 2);
//void(*p1)(func , int, int);//函数指针,基于练习的目的 继续使用typedef
typedef void(*func1)(func , int, int);
func1 p1;
p1 = print;
p1(add, 1, 2);
p1(sub, 4, 2);
(*p1)(add, 1, 2);
(*p1)(sub, 4, 2);//复习上一步 都会打印出同样的数字
return 0;
}
4 万能指针强转函数指针
#include <stdio.h>
typedef int(*func)(int, int);
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
//void print(int(*p)(int, int), int a, int b)
//{
// printf("%d\n", p(a, b));
//}
void print(func p, int a, int b)
{
printf("%d\n", p(a, b));
}
int main()
{
//void(*p1)(func , int, int);//函数指针,基于练习的目的 继续使用typedef
void *p = NULL;
p = print;
//万能指针需要强转后,再调用函数
((void(*)(func p1, int, int))p)(add, 1, 2);
((void(*)(func p1, int, int))p)(sub, 4, 2);
(*(void(*)(func p1, int, int))p)(add, 1, 2);
(*(void(*)(func p1, int, int))p)(sub, 4, 2);//感觉意义不是很大,只是当做练习使用
return 0;
}