指针函数
指针函数 是一个函数 返回值是一个指针类型
ret* fun(arrgs,...)
reg*: 是函数 fun的返回值类型
fun: 函数名
arrgs:形参列表
有一个例子说明
#include <stdio.h>
#include < stdlib.h>
//定义个一个指针函数
int * fun(int n)
{
if(n<0)
printf("must be > 0");
exit(-1); //为退出程序函数 (0)为正常 非0 为异常退出
static int sum=0;
int *p = ∑
for(int i=0;i<n;i++)
{
sum += i;
}
}
int main()
{
int num=0;
printf("Please input : %d",%d);
scanf("%d",num);
int *p = fun(num);
printf("Result : %d\n",*p);
return 0;
}
函数指针 是一个指针 该指针的地址指向了一个函数,总结来说函数指针就是指向 代码段 函数入口地址的指针
局部变量一般存在于栈区,当函数执行完后会释放掉,在使用一个指针去指向这个变量时,不一定会得到正确的值,利用 c关键字 static 去修饰这个局部变量 该变量为静态局部变量,静态局部变量存在于数据段中,周期存在于整个程序运行期间。
还有一种解决方案为使用全局变量 ,全局变量也存在于数据段,(并不推荐使用全局变量)
函数指针
ret (*p)(args,...);
与指针函数不同,函数指针本质上是一个指针,该指针指向了一个函数。所以它是指向函数的指针,函数的定义是存在于代码段,每个函数在代码段中,也有自己的入口地址,函数指针就是指向代码段中函数入口地址的指针。
函数名和数组名一样都作为入口地址
函数指针变量 = 函数名
#include <stdio.h>
int max(int a,int b)
{
a > b ? a : b
}
int main()
{
int (*p)(int a,int b);
p = max;
int ret = p(5,6);
//int ret = *max(5,6);
//int ret = (*p)(10,15)
printf("result : %d\n",ret);
return 0;
}
函数指针的典型应用 就是 回调函数
#include <stdio.h>
int fun_sum(int n)
{
int sum =0;
if (n > 0)
{
printf("n must be > 0\n");
exit(-1);
}
for (int i=0;i < n;i++)
{
sum +=i;
}
return sum;
}
int callback(int n,int (*p)(int))
{
return p(n);
}
int main()
{
int n=0;
printf("Please input :");
scanf("%d",&n);
printf("sum result :%d\n",callback(n,fun_sum));
return 0;
}
以后对fun_sum求和优化,就不需要改其他东西。或者新加函数fun_sum2,直接在调用回调函数的地方将函数指针指向新的函数,无需修改callback函数内部