这是一个奇怪的头衔.如果有人能澄清我究竟是在问什么,我会非常感激,因为我不太确定自己.
我正在观看关于编程范式的斯坦福视频(那位老师很棒),当他开始这样做的时候,我正在观看视频:
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为参数foo但是没有,则失败int (*bar).为什么!?
此外,视频让我对他的lSearch定义感到困惑
void* lSearch( /*params*/ , int (*cmpFn)(void*, void*)) 在定义中调用cmpFn,但在调用lSearch函数时
lSearch( /*params*/, intCmp );
Run Code Online (Sandbox Code Playgroud)
也调用定义的函数int intCmp(void* elem1, void* elem2);,我不知道它是如何工作的.为什么,在lSearch中,是一个名为cmpFn的函数,但定义为intCmp,它是类型的int,不是int*仍然有效吗?为什么lSearch中的函数不必定义参数?
Mic*_*zek 10
int (*cmpFn)(void*, void*)是一个函数指针 - 一个指向稍后可以调用的函数的指针.当你调用iSearch时,你传递一个函数,它接受两个void*并返回一个int,然后将它绑定到参数cmpFn.然后iSearch可以做一些事情,比如int x = cmpFn(voidPtr1, voidPtr2);调用该函数,传递它voidPtr1并voidPtr2作为其参数并存储返回值x
您可以通过声明一个函数指针并在同一函数中使用它来尝试一个简单的示例:
int test1(int x) {return x;}
int test2(int x) {return x+1;}
int main(int argc, char** argv) {
int (*fn)(int); // Function pointer named 'fn' that can hold a function that takes one int argument and returns an int
int rtn;
fn = test1; // Assign the 'test1' function to 'fn'
rtn = fn(4); // Call 'fn' ('test1') with the argument 4; it returns 4 and stores it in 'rtn'
fn = test2; // Assign the 'test2' function to 'fn'
rtn = fn(4); // Call 'fn' ('test2') with the argument 4; it returns 5 and stores it in 'rtn'
}
Run Code Online (Sandbox Code Playgroud)
如果你声明它会失败,int *bar因为它不是一个函数指针,它只是一个指向整数的指针.函数指针的语法是rtn_type (*name)(param1_type, param2_type, ...)