C这行代码在做什么?是铸造吗?

时间:2015-03-28 15:23:22

标签: c variables casting

所以我正在关注一个在线教程(关于OS开发,如果这很重要),我看到这行c代码无效。这是一个简化版本:

void function1(struct regs *r) {
  void (*handler)(struct regs *r);   // What happened here?

  // do things with void *handler
}

那条线发生了什么?它声明了一个变量

  

void * handler

但它做了类似演员的事情?但它看起来不像演员。刚刚发生了什么事?

4 个答案:

答案 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;

如果Tvoid(struct regs *)。 (该行也会影响类型struct regs的声明。)

答案 3 :(得分:0)

函数指针确实看起来有点奇怪。在这种情况下,不会进行转换或赋值 - 这只是一个变量声明。

void (*<variable name>)(<function params>);

在上面的示例中,<variable name>handler<function params>struct regs *r