指针函数与函数指针

1. 函数指针

函数指针 的本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针

#include<stdio.h>

int max(int a,int b){
    if(a>b){
        return a;
    }
    return b;
}

int min(int a,int b){
    if(a>b){
        return b;
    }
    return a;
}

int add(int a,int b){
    a = a+b;
    return a;
}

int main(){
    int a=2,b=4;
    // int (*p)(int ,int);
    int (*p)(int a, int b);   //也可以使用这种方式定义函数指针
    p = max;
    int ret = p(a, b);
    // int ret = (*max)(a, b);
    // int ret = (*p)(a, b);
    printf("max_ret = %d\n",ret);
    p = min;
    ret = p(a, b);
    printf("min_ret = %d\n",ret);
    p = add;
    ret = p(a, b);
    printf("add_ret = %d\n",ret);

    return 0;

}

函数指针变量常用的用途之一是把指针作为参数传递到其他函数(回调函数)

2. 回调函数

回调函数是一个通过指针函数调用的函数。其将函数指针作为一个参数,传递给另一个函数。
回调函数并不是由实现方直接调用,而是在特定的事件或条件发生时由另外一方来调用的。
最主要的用途就是当函数不处在同一个文件中,比如动态库,要调用其他程序中的函数就只有采用回调的形式

#include<stdio.h>

int max(int a,int b){
    if(a>b){
        return a;
    }
    return b;
}

int min(int a,int b){
    if(a>b){
        return b;
    }
    return a;
}

int add(int a,int b){
    a = a+b;
    return a;
}

void callback(int a,int b,int (*fun)(int ,int)){
    printf("%d\n",fun(a,b));
}

int main(){
    int a=2,b=5;
    callback(a,b,max);
    callback(a,b,min);
    callback(a,b,add);

    return 0;
}

3. 指针函数

ret *func(args, ...);

f u n c func func是一个函数, a r g s args args是形参列表, r e t ∗ ret * ret作为一个整体,是 f u n c func func函数的返回值,是一个指针的形式。

#include<stdio.h>

int * add(int a,int b){
    int *p = &a,*q = &b;
    static int c = 0;
    int *s = &c;
    c = *p+*q;
    return s;
}

int main(){
    int a =2,b = 3;
    int *p;
    p = add(a,b);
    printf("1111111\n");//加句话*p输出会变,局部变量是存放于栈区的,当函数结束,栈区的变量就会释放掉
    printf("*p = %d\n",*p);

    return 0;
}

注:

  1. 局部变量是存放于栈区的,当函数结束,栈区的变量就会释放掉
  2. 使用指针函数的时候,一定要避免出现返回局部变量指针的情况
  3. 使用 s t a t i c static static去修饰变量,该变量就变成了静态变量。静态变量是存放在数据段的,它的生命周期存在于整个程序运行期间、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值