关于指针函数和函数指针的关系

指针函数

指针函数 是一个函数 返回值是一个指针类型

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 = &sum;
    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函数内部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值