C函数指针差异

时间:2019-03-20 09:42:23

标签: c function-pointers

我有以下C代码:

#include <stdio.h>

int max(int x, int y, int (*compare)(int, int))
{
  return (*compare)(x,y) ? x : y;
}

int greater_than(int x, int y)
{
  if(x > y) return 1;
  else return 0;
}

int main(void) {
 printf("%d",max(6,7,greater_than));
}

它只是在这里测试函数指针。但是,即使我不使用int (*compare)(int,int)而是使用int compare(int,int),代码仍然可以正常工作。如果我不取消引用函数指针或使用int compare(int,int)但仍然取消引用,它也可以工作。如果我通过greater_than&greater_than也没有什么不同。为什么会这样?

关于 新星

2 个答案:

答案 0 :(得分:4)

这两个版本等效:

  • warmpup = []; // actual data array warmupTemp= []; // template array index = 0; addWarmUp() { this.warmupTemp.push(warmup[index]); index++; }
  • int max(int x, int y, int (*compare)(int, int))

就像将数组作为参数传递给函数“ decay”并传递到指向第一个元素的指针一样,函数也会发生类似的“ decay”。它们衰减为函数指针。标准说

  

将参数声明为“函数返回类型”应调整为“指向”   函数返回类型”

因此,上面的第二个(晦涩的)版本被编译器静默转换为第一个版本。但是,从来没有理由在参数列表中声明一个函数,因此整个问题都颇具异国情调。


关于int max(int x, int y, int compare(int, int))为何能像compare(x,y)一样工作或就(*compare)(x,y)而言,这是因为无论何时使用函数名称或函数指针,总会得到一个函数指针。如果尝试取消引用函数指针,则会获得该函数。它再次隐式地反弹回函数指针。

请参见Why do function pointer definitions work with any number of ampersands '&' or asterisks '*'?


初学者和退伍军人都可以安全地忘记上述晦涩的规则,只需执行以下操作即可:

(*****compare)(x,y)

或者更好,使用typedef:

int max(int x, int y, int (*compare)(int, int))
{
  return compare(x,y) ? x : y;
}

答案 1 :(得分:0)

伦丁之前给出的好答案。 代表的评论太低,因此我将其放在此处多余。我在stackoverflow的类似文章上看到了链接,我喜欢本教程。

教程链接的起源是以下问题:How do you pass a function as a parameter in C?

上面提到的函数指针教程:http://www.newty.de/fpt/index.html

希望我不是放任自流,我喜欢它,也许它也会为您带来愉快的阅读。