【发布时间】:2014-12-04 23:49:47
【问题描述】:
编辑:有人指出这个问题有点令人困惑。简短的版本是:“为什么有一个单独的指针变量(例如,fnPtr)指向一个函数(例如,fn),而函数名称fn 本身,没有参数,已经是一个指针?/编辑
我正在尝试理解一些东西,并且可以使用社区关于函数指针的反馈。 (虽然这看起来可能与该主题的其他问题重复,但实际上并非如此,至少我找不到。)
我理解一个函数的指针被用作另一个函数的参数作为回调的概念......即告诉fn1 在执行fn1 期间以某种方式使用fn2。我不明白的是所有这些都使用了复杂的语法。如果fn 是已定义函数,则调用fn(...) 将使用提供的参数执行该函数。但是,单独使用的fn是函数的地址,也就是指向函数的指针。此外,fn、&fn 和 *fn 都是同一个东西。为什么要有专用的函数指针,为什么要创建指向函数的新变量(即fnPtr)……函数名已经是它自己的指针了!
这段代码每次编译和工作都是一样的。
#include <stdlib.h>
#include <stdio.h>
int fn(int var) { //fn is a function which takes an int and returns an int
return var;
}
int (*fnPtrAmp)(int) = &fn;
int (*fnPtr)(int) = fn;
int needsCallback(int variable, int callback(int)) {
return callback(variable);
}
int needsCallbackPointer(int variable, int (*callbackPtr)(int)) {
return callbackPtr(variable);
}
int needsCallbackPointerWithDereference(int variable, int (*callbackPtr)(int)) {
return (*callbackPtr)(variable);
}
int main() {
printf("%d\n", fn(4));
printf("%d\n", fnPtr(4));
printf("%d\n", (*fnPtr)(4));
printf("%d\n", needsCallback(4,fn));
printf("%d\n", needsCallbackPointer(4,fnPtr));
printf("%d\n", needsCallbackPointer(4,fn));
printf("%d\n", needsCallbackPointer(4,&fn));
printf("%d\n", needsCallbackPointerWithDereference(4,fnPtr));
printf("%d\n", needsCallbackPointerWithDereference(4,fn));
printf("%d\n", needsCallbackPointerWithDereference(4,&fn));
return 0;
}
最简单的语法是needsCallback,但这不是在任何地方都可以做到的,它总是needsCallbackPointer 和fnPtrAmp。为什么?使用needsCallback,您甚至不必定义额外的变量作为函数指针。前面说了,函数名就是它自己的指针!
可以使用一些反馈...谢谢。
【问题讨论】:
-
您询问了五个不同的问题,并在您自己的帖子中回答了其中一些问题。您的实际问题是什么?
-
似乎有两个问题:(1)为什么有函数指针?(2)为什么函数名上允许
&,而函数指针上允许*。您在自己的帖子中使用回调示例回答 (1),并且 (2) 得到回答 here -
问题不在于为什么有函数指针本身,而是为什么有一个单独的指针变量(例如,
fnPtr),它指向一个函数(例如,fn),而函数名fn本身,不带参数,已经是指针了? -
如果你有多个函数可供选择,你只需要创建一个单独的函数指针variable,但是直到运行时才做出选择。否则,如果你知道你总是会传递一个指向同一个特定函数的指针,使用那个特定的函数名。
-
@austin1howard 你写了这段代码,所以我很困惑你为什么问“为什么有这个代码”。这就像说“当我以后可以写
5时,int x = 5;有什么意义”
标签: c pointers function-pointers