我最近在C中使用了函数指针.
继续回答你自己的问题的传统,我决定对那些需要快速深入研究这个主题的人进行一些基本的总结.
可能重复:
函数指针有什么意义?
我试图了解在实际场景中使用函数指针的位置.也有人可以给我一个实际的例子,我们必须将函数本身作为参数传递给另一个函数.
有趣的是,将函数名称用作函数指针等同于将address-of运算符应用于函数名称!
这是一个例子.
typedef bool (*FunType)(int);
bool f(int);
int main() {
FunType a = f;
FunType b = &a; // Sure, here's an error.
FunType c = &f; // This is not an error, though.
// It's equivalent to the statement without "&".
// So we have c equals a.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用这个名称是我们在数组中已经知道的.但是你不能写出类似的东西
int a[2];
int * b = &a; // Error!
Run Code Online (Sandbox Code Playgroud)
这似乎与该语言的其他部分不一致.这个设计的基本原理是什么?
这个问题解释了这种行为的语义及其工作原理.但是我对这种语言设计的原因很感兴趣.
更有趣的是,当用作参数时,函数类型可以隐式转换为指向自身的指针,但在用作返回类型时不会转换为指向自身的指针!
例:
typedef bool FunctionType(int);
void g(FunctionType); // Implicitly converted to void g(FunctionType …Run Code Online (Sandbox Code Playgroud) 我明白我可以使用指针来实现功能.
有人可以解释为什么会使用它们,以及如何使用它们?简短的示例代码对我很有帮助.
Q1.为什么使用回调函数?
Q2.回调是邪恶的吗?对于那些知道,对他人来说是噩梦的人来说,这很有趣.
Q3.回调的替代方案?
这是一个奇怪的头衔.如果有人能澄清我究竟是在问什么,我会非常感激,因为我不太确定自己.
我正在观看关于编程范式的斯坦福视频(那位老师很棒),当他开始这样做的时候,我正在观看视频:
void *lSearch( void* key, void* base, int elemSize, int n, int (*cmpFn)(void*, void*))
Run Code Online (Sandbox Code Playgroud)
当然,我心想,"我,我不知道你可以宣布一个功能并在以后定义它!".所以我创建了自己的C++测试版.
int foo(int (*bar)(void*, void*));
int bar(void* a, void* b);
int main(int argc, char** argv)
{
int *func = 0;
foo(bar);
cin.get();
return 0;
}
int foo(int (*bar)(void*, void*))
{
int c(10), d(15);
int *a = &c;
int *b = &d;
bar(a, b);
return 0;
}
int bar(void* a, void* b)
{
cout << "Why hello there." << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
关于代码的问题是这样的:如果我将函数声明int *bar …
就在最近,我在接受采访时被问到:我们在哪里可以使用C中的函数指针?什么函数指针返回.我说使用我们可以使用函数指针调用函数然后他问了一些例子,但我不能满足于他更多的例子.然后他问我什么函数指针返回.我告诉他这取决于函数指针的声明.
但我真的想知道C中函数指针的一些用法.
使用函数指针而不是函数本身的真正好处是什么?它会使执行更快吗?或者当它传递给另一个函数时它是否提供了便利?
我有一个关于链表和模板的作业,其中有一些带有奇怪参数的函数是强制性的。我找不到有关它的在线文档,并且感谢任何提供的材料。
我尝试为 op 分配另一个地址,然后它编译得很好,但我无法调用它。
template <class T> struct L1Item {
T data;
L1Item<T> *pNext;
L1Item() : pNext(NULL) {}
L1Item(T &a) : data(a), pNext(NULL) {}
};
template <class T> class L1List {
L1Item<T> *_pHead; // The head pointer of linked list
size_t _size; // number of elements in this list
public:
void traverse(void (*op)(T &)) {
// TODO: Your code goes here
}
void traverse(void (*op)(T &, void *), void *pParam) {
// TODO: Your code goes here
// string *Req …Run Code Online (Sandbox Code Playgroud) 我即将用C++编写程序,但我不确定如何去做.我想创建一个程序,可以与命令行前端一起使用,但也可以使用GUI前端,因为我不想将用户绑定到特定的接口,例如依赖项的小部件工具包.
怎么做最好的方法呢?我知道像RSync和SSH这样的程序在GUI中有前端,但我不确定如何做到这一点.拥有一个只使用system()来运行它的程序,同时拥有一个漂亮的GUI,这不是很麻烦吗?
函数指针是否会影响程序的运行时间?
int (*fptr1)(int);
int square(int num) {
return num*num;
}
int main()
{
int n = 5;
fptr1 = square;
printf("%d squared is %d\n",n, fptr1(n));
return 0;
}
Run Code Online (Sandbox Code Playgroud) c++ ×7
c ×6
pointers ×2
backend ×1
callback ×1
embedded ×1
frontend ×1
linked-list ×1
memory ×1
oop ×1
parameters ×1
syntax ×1
templates ×1
visual-c++ ×1