1.先从一个简单的求和求积函数开始
#include <stdio.h>
int add(int a , int b)
{
return a + b;
}
int mul(int a , int b)
{
return a * b;
}
int main()
{
int a_count = add(5,7);
int m_count = mul(5,7);
printf("a_count is %d\n",a_count);
printf("m_count is %d\n",m_count);
return 0;
}
输出:
a_count is 12
m_count is 35
Program ended with exit code: 0
2.试一下函数指针
#include <stdio.h>
int add(int a , int b)
{
return a + b;
}
int mul(int a , int b)
{
return a * b;
}
int main()
{
int (*p_add)(int,int);//声明函数指针
p_add = add;
int (*p_mul)(int,int);
p_mul = mul;
int a_count = p_add(5,7);
int m_count = p_mul(5,7);
printf("a_count is %d\n",a_count);
printf("m_count is %d\n",m_count);
return 0;
}
结果不变
a_count is 12
m_count is 35
Program ended with exit code: 0
3.简化一下函数指针的定义
#include <stdio.h>
int add(int a , int b)
{
return a + b;
}
int mul(int a , int b)
{
return a * b;
}
int main()
{
typedef int (*fun)(int,int);//定义类型fun是一个指向函数的指针
fun p_add = add;
fun p_mul = mul;
int a_count = p_add(5,7);
int m_count = p_mul(5,7);
printf("a_count is %d\n",a_count);
printf("m_count is %d\n",m_count);
return 0;
}
结果不变
a_count is 12
m_count is 35
Program ended with exit code: 0
4.尝试使用一下函数指针数组
#include <stdio.h>
int add(int a , int b)
{
return a + b;
}
int mul(int a , int b)
{
return a * b;
}
int main()
{
int (*func[])(int,int) = {add,mul};//定义函数指针数组
int a_count = func[0](5,7);
int m_count = func[1](5,7);
printf("a_count is %d\n",a_count);
printf("m_count is %d\n",m_count);
return 0;
}
结果不变
a_count is 12
m_count is 35
Program ended with exit code: 0
5.改善函数指针数组
毕竟,函数多了之后,谁能记住乘法是在数组里第几个,下标该是多少。
#include <stdio.h>
int add(int a , int b)
{
return a + b;
}
int mul(int a , int b)
{
return a * b;
}
int main()
{
int (*func[])(int,int) = {add,mul};//定义函数指针数组
enum func_tpye{ ADD , MUL }; //顺序与上面保持一致
int a_count = func[ADD](5,7);
int m_count = func[MUL](5,7);
printf("a_count is %d\n",a_count);
printf("m_count is %d\n",m_count);
return 0;
}
结果不变
a_count is 12
m_count is 35
Program ended with exit code: 0
6.在函数中调不同的函数
之前的例子,直接用函数会更好用一些
#include <stdio.h>
typedef int (*fun)(int,int);
int add(int a , int b)
{
return a + b;
}
int mul(int a , int b)
{
return a * b;
}
int add_mul(fun f,int a,int b)
{
return f(a,b);
}
int main()
{
int (*func[])(int,int) = {add,mul};//定义函数指针数组
enum func_tpye{ ADD , MUL }; //顺序与上面保持一致
printf("a_count is %d\n",add_mul(func[ADD], 5, 7));
printf("m_count is %d\n",add_mul(func[MUL], 5, 7));
return 0;
}
结果不变
a_count is 12
m_count is 35
Program ended with exit code: 0
7.上面那个例子还可以再扩展的更强大一些
比如说把两个数相乘相加改为多个数相乘相加
#include <stdio.h>
#include <stdarg.h>
typedef int (*fun)(int,int);
int add(int a , int b)
{
return a + b;
}
int mul(int a , int b)
{
return a * b;
}
int add_mul(fun f,int n,...)
{
va_list ap;
va_start(ap,n);
int count = va_arg(ap, int);
for (int i = 0; i<(n-1); ++i) {
count = f(count,va_arg(ap, int));
}
return count;
}
int main()
{
int (*func[])(int,int) = {add,mul};//定义函数指针数组
enum func_tpye{ ADD , MUL }; //顺序与上面保持一致
printf("a_count is %d\n",add_mul(func[ADD], 5,1,2,3,4,5));
printf("a_count is %d\n",add_mul(func[ADD], 3,7,3,6));
printf("m_count is %d\n",add_mul(func[MUL], 5,1,2,3,4,5));
printf("m_count is %d\n",add_mul(func[MUL], 3,7,3,6));
return 0;
}
第一个参数为功能函数,第二个参数为运算的个数,之后是不定参数。
结果为:
a_count is 15
a_count is 16
m_count is 120
m_count is 126
Program ended with exit code: 0