C语言 函数指针(三):函数内条件判断,将不同的函数地址返回给函数指针

执行结果一的截图:

  执行结果二的截图:

函数指针及各函数地址截图1:

可见当输入的运算符是减号,fp被赋值为函数sub的地址,

执行(* fp)()或写为fp(),其实就是执行sub(),也就是执行相减运算

函数指针及各函数地址截图2:

可见当输入的运算符是加号,fp被赋值为函数add的地址,

执行(* fp)()或写为fp(),其实就是执行add(),也就是执行求和运算

 

 

代码:

#include <stdio.h>

int add(int, int);
int sub(int, int);
int calc(int (*)(int, int), int, int);
int (* select(char))(int, int);
int add(int num1, int num2)
{
return num1 + num2;
}

int sub(int num1, int num2)
{
return num1 - num2;
}
int calc(int (* fp)(int, int), int num1, int num2)
{
/* int (* fp)(int, int)定义了fp为一个函数指针,fp不是函数
* 函数指针fp是一个变量,需要被定义、被赋值、被调用,
* 函数指针变量,可以被一个函数名赋值,
* 函数名也即函数的指针,其值是函数的地址,
* 函数指针需在被赋值了函数地址后,才能被调用,
* 纯函数名代表的是函数的地址,不是对函数进行调用
* 只有在函数名后面跟着()才是对函数进行调用
* 函数(* fp)与函数add以及函数sub的类型一致,
* 如果将函数名赋值给指针函数fp,也即将函数的地址赋值给fp,那么
* 而(* fp)()就代表了对fp所指向的函数进行调用。
* 注意:(* fp)并不能对fp指向的函数地址进行解引用,要(* fp)()才算
*/
return (* fp)(num1, num2);
}
int (* select(char op))(int, int)
{
//select是一个函数,函数需要被声明、被定义、被调用
switch(op)
{
case '+': return add;
case '-': return sub;
default: return printf("Error: invalid inputs...!\n");
}
}
int main()
{
int num1;
int num2;
char op;
// int (* fp)(int, int)定义了fp为一个函数指针,fp不是函数
// 函数指针fp是一个变量,需要被定义、被赋值、被调用,
// 函数指针变量,可以被一个函数名赋值,
// 函数名的值是函数的地址,
// 函数指针需在被赋值了函数地址后,才能被调用,
// 纯函数名只是一个函数指针,只有在函数名后面跟着()才是对函数进调用
// 函数select的返回值要么是函数add要么是函数sub
// int (* fp)(int,int)与函数add以及函数sub的类型一致,
// 因此函数select的返回值可以赋值给fp,

int (* fp)(int, int);

printf("请输入一个整数相加或相减的式子(如 1 + 3, 或 9 - 6):");

/* 把从键盘依次输入的第一个整数、加号或减号运算符、第二个整数
* 依次赋值给变量num1、变量op、变量num2
*/
scanf("%d%c%d", &num1, &op, &num2);

/* 执行函数select,
* select函数内执行switch(op)语句,对传入的加号或减号进行判断,
* 根据判断结果,返回函数add的地址或函数sub的地址,
* 把函数add的地址或函数sub的地址(由函数select的返回值决定)赋值给函数指针fp,
* 赋值后,fp就指向了函数add或函数sub的地址(由函数select的返回值决定),并且
* 可以在calc函数中对fp进行传址,
* 并通过调用函数(* fp)()来调用函数add或函数sub(由函数select的返回值决定)
*/
fp = select(op);
    //printf("selectAddr:%p\nfp:%p\n* fp:%c %d %p\n(* fp)(%d,%d):%d \nadd:%p\nsub:%p\ncalc:%p\n", select, fp, * fp, * fp, * fp, num1, num2, (* fp)(num1,num2), add, sub, calc);
    /* 函数calc用函数指针fp传址调用函数(* fp)()
* 如果函数指针fp的当前值是指向函数add的地址,则调用函数add
* 如果函数指针fp的当前值是指向函数sub的地址,则调用函数sub
*/
printf("%d %c %d = %d\n", num1, op, num2, calc( fp, num1, num2));

return 0;
}
posted @   JohnnyH  阅读(278)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示