所以我正在关注一个在线教程(关于OS开发,如果这很重要),我看到这行c代码无效。这是一个简化版本:
void function1(struct regs *r) {
void (*handler)(struct regs *r); // What happened here?
// do things with void *handler
}
那条线发生了什么?它声明了一个变量
void * handler
但它做了类似演员的事情?但它看起来不像演员。刚刚发生了什么事?
答案 0 :(得分:4)
void (*handler)(struct regs *r);
将handler
声明为指向函数的指针,该函数需要类型为struct regs *
的参数并返回类型void
。
答案 1 :(得分:2)
void (*handler)(struct regs *r);
这个特殊形式是函数指针的声明。这里没有演员阵容。
handler
是一个指向函数的指针,该函数接受类型struct regs *
的参数并且不返回任何内容。
可以像这样使用:
void foo(struct regs *r)
{
/* a function that takes an argument of type
* struct regs * and returns nothing
*/
}
void (*handler)(struct regs *r);
handler = foo; // assign foo to handler object
handler(NULL); // call the function, here with a null pointer
// to simplify the example
答案 2 :(得分:0)
该行声明了一个名为handler
的变量。它相当于
T * handler;
如果T
是void(struct regs *)
。 (该行也会影响类型struct regs
的声明。)
答案 3 :(得分:0)
函数指针确实看起来有点奇怪。在这种情况下,不会进行转换或赋值 - 这只是一个变量声明。
void (*<variable name>)(<function params>);
在上面的示例中,<variable name>
为handler
,<function params>
为struct regs *r
。