2_指针函数和函数指针的理解笔记

指针函数和函数指针的理解笔记

敲黑板!!!
指针函数返回指针,而函数指针存储函数的地址,是用来指向函数的
指针函数
定义指针函数:GetBookNam,功能是通过编号获取书名

/*
* 定义全局变量指针数组,每一个元素都是一个指针,指向字符串的指针
* Str[0]指向的是字符串"c程序设计"
* Str[1]指向的是字符串"c与指针"
* ...
*/
char *Str[] = {
                "c程序设计",
                "c与指针",
                "c陷阱与缺陷",
                "非法编号"
                };
//指针函数,函数返回的是指向字符串的指针
char *GetBookNam(char Ind)
{
    if ((0 == Ind)||(Ind>2))
    {
        return Str[3];
    }
    else
    {
        //-1 就是让输入编号1的时候指向Str[0]所指位置
        return Str[Ind-1];
    }
}
int main (void)
{
    char BookInd;
    printf("请输入你要找的书的编号(如1):");
    scanf("%d",&BookInd);

    printf("改编号的书名是:%s\n",GetBookNam(BookInd));
    return 0;
}

运行结果如下图所示:
在这里插入图片描述

函数指针
函数指针是指向函数的指针,即它存储了函数的地址

int add(int x, int y)
{
    return x + y;
}

int main()
{
     //定义函数指针p,这个指针指向的函数有两个int变量的形参
    int (*p)(int, int);
    //让指针函数指向add函数
    p = add;
    //通过函数指针直接调用add函数,以下两种调用都可以
    printf("2+4= %d \n",p(2,4));
    //这种形式的调用比较直观,一看就知道p是一个函数指针
    //printf("2+4= %d \n",(*p)(2,4));
}

如上代码:通过函数指针p调用add函数,我们并没有看出来函数指针的优势,程序效率也没有直接调用函数add来的效果高,接下来我们来看看函数指针的大用途。

1)函数指针作为形参传递,大大提高程序灵活性

int add(int x,int y)
{
    return x+y;
}

int sub(int x,int y)
{
    return x-y;
}
/*
*定义一个函数,这个函数有3个形参
*形参1-->>函数指针pFun指向的函数是一个带有两个整形变量,且返回值是int型变量,简单说形参1,就是一个函数地址
*形参2-->>
*形参3-->>
*注:形参1定义的函数指针满足指向add和sub函数的要求,返回整形,有两个int型变量作为形参
*/
int calc(int (*pFun)(int,int),int x,int y)
{
    return pFun(x,y);
}

int main()
{
    printf("验证calc函数:2+4 = %d\n",calc(add,2,4));
    printf("验证calc函数:2-4 = %d\n",calc(sub,2,4));
    return 0;
}

代码运行结果如下:
在这里插入图片描述

2)函数指针作为返回值,当有时候不确定具体调用哪个函数,只有在某一事件发生后才确定,这时我们事先可以定义一个函数指针(比如回调函数)

int add(int x,int y)
{
    return x+y;
}

int sub(int x,int y)
{
    return x-y;
}
/*
*定义一个函数,这个函数有3个形参
*形参1-->>函数指针pFun指向的函数是一个带有两个整形变量,且返回值是int型变量,简单说形参1,就是一个函数地址
*形参2-->>
*形参3-->>
*注:形参1定义的函数指针满足指向add和sub函数的要求,返回整形,有两个int型变量作为形参
*/
int calc(int (*pFun)(int,int),int x,int y)
{
    return pFun(x,y);
}

//定义一个返回值是函数指针的函数select
/*
*解读:看(*select(char op)),由于select后面紧跟(char op)参数列表,所以select是一个函数且此函数有一个形参op
*由于select前面带有*号,所以返回值是一个指针,那么指针指向的是什么???
*把已知的函数名和对应的参数去掉变成int (*)(int,int),此时变成一个函数指针,
*所以select的返回值是一个函数指针,指向的是一个带有两个int型形参且返回值是整形的函数
*/
int (*select(char op))(int,int)
{
    switch(op)
    {
        case '+':
            return add;
        case '-':
            return sub;
        default:
            return NULL;
    }
}

int main()
{
    int num1,num2;
    char op;
    //定义一个函数指针用来接受select返回的函数地址(add或者sub)    
    int (*pFun)(int,int); 
    
    printf("请输入一个式子(如4+5):");
    scanf("%d%c%d",&num1,&op,&num2);

    //通过输入的运算数op,决定调用add还是sub
    pFun = select(op);

    printf("%d %c %d = %d \n",num1,op,num2,calc(pFun,num1,num2));

    return 0;
}

代码运行结果如下:

//通过输入的运算数op,决定调用add还是sub
pFun = select(op);

printf("%d %c %d = %d \n",num1,op,num2,calc(pFun,num1,num2));

return 0;

}

代码运行结果如下:  
![在这里插入图片描述](https://img-blog.csdnimg.cn/42d7e1ca4fa74697ba85d4b9581ffb5b.png#pic_center)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flipped--0228

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值