我有以下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
也没有什么不同。为什么会这样?
关于 新星
答案 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
希望我不是放任自流,我喜欢它,也许它也会为您带来愉快的阅读。