鱼C论坛

 找回密码
 立即注册
查看: 3993|回复: 7

很纠结的函数指针问题

[复制链接]
发表于 2012-3-18 20:22:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 mfshik 于 2012-3-18 20:35 编辑

遇到了一个很纠结的的问题 希望某位大神帮我解答下
为啥这样编译不通过
  1. #include <stdio.h>
  2. int process( int, int, int(*fun)() );
  3. int max(int,int);
  4. int min(int,int);
  5. int sub(int,int);
  6. int main(void)
  7. {

  8.         int a=0,b=0;
  9.         printf("Please enter two numbers:");
  10.         scanf("%d,%d",&a,&b);

  11.         
  12.         printf("max=%d\n",process(a,b,max));
  13.         
  14.         
  15.         printf("min=%d\n",process(a,b,min));


  16.         printf("sub=%d\n",process(a,b,sub));
  17.         
  18.         return 0;
  19. }

  20. int process( int a, int b, int (*fun)())
  21. {
  22.         return (*fun)(a,b);
  23. }

  24. int max(int a,int b)
  25. {
  26.         return a>b?a:b;
  27. }

  28. int min(int a,int b)
  29. {
  30.         return a<b?a:b;
  31. }

  32. int sub(int a,int b)
  33. {
  34.         return a-b;
  35. }
复制代码

只有改为下面这样才可以
  1. #include <stdio.h>
  2. int process( int, int, int(*fun)(int,int) );
  3. int max(int,int);
  4. int min(int,int);
  5. int sub(int,int);
  6. int main(void)
  7. {

  8.         int a=0,b=0;
  9.         printf("Please enter two numbers:");
  10.         scanf("%d,%d",&a,&b);

  11.         
  12.         printf("max=%d\n",process(a,b,max));
  13.         
  14.         
  15.         printf("min=%d\n",process(a,b,min));


  16.         printf("sub=%d\n",process(a,b,sub));
  17.         
  18.         return 0;
  19. }

  20. int process( int a, int b, int (*fun)(int,int))
  21. {
  22.         return (*fun)(a,b);
  23. }

  24. int max(int a,int b)
  25. {
  26.         return a>b?a:b;
  27. }

  28. int min(int a,int b)
  29. {
  30.         return a<b?a:b;
  31. }

  32. int sub(int a,int b)
  33. {
  34.         return a-b;
  35. }
复制代码
但为什么鱼哥视频中 这样却可以编译通过
  1. /***********************************************************/
  2. /*  设一个函数process,在调用它的时候,每次实现不同的功能。*/
  3. /*  输入a和b两个数,第一次调用process时找出a和b中大者,*/
  4. /*  第二次找出其中小者,第三次求a与b之和。               */
  5. /***********************************************************/

  6. #include <stdio.h>

  7. void main()
  8. {
  9.       int max(int, int);            /* 函数声明 */
  10.       int min(int, int);            /* 函数声明 */
  11.       int add(int, int);            /* 函数声明 */
  12.    
  13.       void process( int, int, int(*fun)() );    /* 函数声明 */
  14.       
  15.       int a, b;

  16.       printf("Endter a and b: ");
  17.       scanf("%d %d", &a, &b);
  18.       
  19.       printf("max = ");
  20.       process(a, b, max);

  21.       printf("min = ");
  22.       process(a, b, min);

  23.       printf("sum = ");
  24.       process(a, b, add);
  25. }

  26. int max(int x, int y)              /* 函数定义 */
  27. {
  28.       int z;
  29.       
  30.       if( x > y )
  31.       {
  32.             z = x;
  33.       }
  34.       else
  35.       {
  36.             z = y;
  37.       }

  38.       return z;
  39. }

  40. int min(int x, int y)              /* 函数定义 */
  41. {
  42.       int z;

  43.       if( x < y )
  44.       {
  45.             z = x;
  46.       }
  47.       else
  48.       {
  49.             z = y;
  50.       }

  51.       return z;
  52. }

  53. int add(int x, int y)
  54. {
  55.       int z;
  56.       
  57.       z = x + y;
  58.       return z;
  59. }

  60. void process( int x, int y, int(*fun)() )    /* 函数定义 */
  61. {
  62.       int result;

  63.       result = (*fun)(x, y);
  64.       printf("%d\n", result);
  65. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-18 20:29:33 | 显示全部楼层
主要注意那个函数指针声明
int process( int, int, int(*fun)() )
与       int process( int, int, int(*fun)(int,int) )
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-18 20:41:06 | 显示全部楼层
求解答:(:(:(
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-18 20:51:20 | 显示全部楼层

回帖奖励 +10 鱼币

int process( int, int, int(*fun)() );
此函数的最后一个参数是一个指针,该指针指向一个函数,该函数没有输入参数。但是你调用的时候
为:
process(a,b,max);
函数名做函数的参数会退化为函数指针,但max函数原型是:int max(int,int);它有两个参数
与int process( int, int, int(*fun)() );中int(*fun)() 不带参数矛盾,所以报错。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-18 20:56:45 | 显示全部楼层
嗯 先谢了 不过为什么鱼哥的第三段代码  void process( int x, int y, int(*fun)() ) 同样不带参数啊?为什么也是正确的
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-18 21:00:29 | 显示全部楼层
是这样的,如果把源程序后缀写为.c(就是C语言)上面的所有代码都是合法的
但源程序后缀写为.cpp(就是C++语言),则你的第一个代码和小甲鱼的代码都不能通过编译。
因为相对于C,C++加强了类型检查
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-18 21:02:15 | 显示全部楼层
嗯 原来如此真实太感谢了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-6 17:04:05 | 显示全部楼层
如此强悍,懂了一点点!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-12 04:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表