关于函数指针的问题,新手跪求啊!

皮皮史卢比 学生  2017-12-07 02:26:15



第一个问题。既然定义了函数指针 int (*p)(); 并且 p=max。。为什么有变量指针调用函数的时候不是p(a,b)而是(*p)(a,b)呢??

第二个问题,定义函数指针的时候为什么不这样定义呢?(*p)(int a,int b)。
两个问题都帮我解答下吧。谢谢啦
...全文
119 12 1 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
赵4老师 2017-12-07
《牛肉干》 C语言上机课,某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上,卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子: int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译,运行结果正确!
  • 打赏
  • 举报
回复
paschen 2017-12-07
1、两种方法效果是一样的,如果你想,甚至可以写成:(*****p)(a,b) 2、确实需要定义成:(*p)(int a,int b),C语言里允许这样的隐匿转换,在C++里则会报错
  • 打赏
  • 举报
回复
赵4老师 2017-12-07
仅供参考:
#include <stdio.h>
double A[300][100];
double valuex[300];
double valuey[300];
int i;
double fun00(double x,double y) {return x  +   y  ;};
double fun01(double x,double y) {return x*x+ 3*y  ;};
double fun02(double x,double y) {return x  + 2*y*x;};
//...  fun03(double x,double y) {return ...+...   ;};
//...
//...  fun98(double x,double y) {return ...+...   ;};
double fun99(double x,double y) {return x/2+20*y  ;};
double (*funNN[100])(double,double)={
    fun00,
    fun01,
    fun02,
//  fun03,
//  ...
//  fun98,
    fun99,
};
int main() {
    double x,y;
    int f,FN;

    for (i=0;i<300;i++) {
        valuex[i]=(double)i;
        valuey[i]=(double)i;
    }
    FN=3;
    for (i=0;i<300;i++) {
         x=valuex[i];
         y=valuey[i];
         for (f=0;f<FN;f++) A[i][f]=funNN[f](x,y);
    }
    for (i=0;i<3;i++) {
        for (f=0;f<FN;f++) printf("%lg ",A[i][f]);
        printf("\n");
    }
    return 0;
}
//0 0 0
//2 4 3
//4 10 10
  • 打赏
  • 举报
回复
wodexiaojidan 2017-12-07
C语言里面int (*p)()表示参数个数以及类型未知,不建议这么写, (*p)(a, b)和(******p)(a, b)和p(a, b)效果都是一样的 这里标准的定义是int (*p)(int, int) 帮你解释了你又不看
  • 打赏
  • 举报
回复
皮皮史卢比 2017-12-07
第一个问题。既然定义了函数指针 int (*p)(); 并且 p=max。。为什么有变量指针调用函数的时候不是p(a,b)而是(*p)(a,b)呢?? 这个问题谁能给出详细的解释么?
  • 打赏
  • 举报
回复
自信男孩 2017-12-07
函数指针定义时需要确定参数的个数,类型已经返回值的类型。这样函数指针才能和对应的函数匹配。 若函数指针比较多,参数个数,类型以及返回值不确定就会有问题。
  • 打赏
  • 举报
回复
自信男孩 2017-12-07
#include <stdio.h>

int my_max(int a, int b);

int main(void)
{
    int (*pfunc)(int, int);

    pfunc = my_max;

    printf("%d\n", pfunc(2, 3));

    return 0;
}

int my_max(int a, int b)
{
    return (a > b ? a : b);
}
参考一下吧;
  • 打赏
  • 举报
回复
赵4老师 2017-12-07
//char (*(*x[3])())[5];//x是什么类型的变量?
//
//分析C语言声明,关键是搞清楚这个变量是个什么东西(函数、指针、数组),
//是函数那么剩下的就是他的参数和返回值,
//是指针那剩下部分是说明他指向什么,
//是数组剩下的部分就是说明数组的成员是什么类型。
//解析C语言声明规则:
//从左侧第一个标识符开始,按照优先级进行结合。*表示是..的指针,const表示只读的,volatile表示可变的,[]表示是数组,()表示是函数。
//
//x和[3]结合说明是一个大小为3的数组,该数组的每个元素为一类指针,该类指针指向一类函数,该类函数无参数,返回一类指针,该类指针指向一个大小为5的char型数组
#include <stdio.h>
#include <typeinfo.h>
char num[5];
char (*x00())[5] {
    return #
}
int main() {
    char (*(*x[3])())[5];//是个数组,大小为3
    char (*(*x0  )())[5];//数组的元素,是个函数指针
    char (*( x00 )())[5];//函数原型,参数为空,返回值为指针
    char (*  x000   )[5];//返回值

    x0 = x00;
    x[0] = x0;
    x[1] = x0;
    x[2] = x0;
    printf("typeid(x).name() is %s\n",typeid(x).name());
    return 0;
}
//typeid(x).name() is char (* (__cdecl**)(void))[5]
  • 打赏
  • 举报
回复
wodexiaojidan 2017-12-07
这里标准的定义是int (*p)(int, int)
  • 打赏
  • 举报
回复
皮皮史卢比 2017-12-07
顶!!求解啊!
  • 打赏
  • 举报
回复
wodexiaojidan 2017-12-07
C语言里面int (*p)()表示参数个数以及类型未知,不建议这么写, (*p)(a, b)和(******p)(a, b)和p(a, b)效果都是一样的
  • 打赏
  • 举报
回复
clover_ever 2017-12-07
正好我也在找这个问题,不懂帮顶,一起学习
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2017-12-07 02:26
社区公告
暂无公告