在函数调用中使用多个星号有什么用?

时间:2012-08-30 07:57:42

标签: c++ c function-pointers dereference function-call

我无法想到在函数调用中实际使用多个星号:

void foo(int a, char b)
{

}

int main(void)
{
    (**************foo)(45, 'c');

    //or with pointer to function:
    void (*ptr)(int, char) = foo;
    (******ptr)(32, 'a');
}

为什么在C和C ++中都允许这个东西?

4 个答案:

答案 0 :(得分:42)

C和C ++中的标准转换之一是函数到指针的转换;当函数名出现在表达式中时,它可以转换为指向该函数的指针。所以:

  • foo相当于&foo
  • *foo相当于*(&foo)foo
  • **foo**(&foo)*foofoo
  • 等效

等等。

这意味着您可以在功能名称之前合法添加任意数量的*,而不会更改其含义。但是,没有理由这样做。

答案 1 :(得分:39)

  

为什么在C和C ++中都允许这个东西?

我不能代表C ++,但对于C,至少将函数指示符转换为指针:

  

6.3.2.1 - 4

     

函数指示符是具有函数类型的表达式。除了   当它是sizeof运算符或一元&运算符的操作数时运营商,   类型为''函数返回类型''的函数指示符是   转换为类型为''指向函数的指针的表达式   返回类型''。

应用间接运算符会产生一个函数指示符:

  

6.5.3.2 - 3

     

一元*运算符表示间接。如果操作数指向a   函数,结果是函数指示符

所以无论你应用间接运算符多少次,你都会得到同样的东西:一个立即转换为指针的函数指示符。


在我看来,这样做很少或没有用。

答案 2 :(得分:9)

因为*运算符需要地址值。每当一个值出现时(与一个对象或函数glvalue相反),rvalue的左值,指针和数组到指针转换的函数都应用于一个操作数。因此,当再次取消引用时,解除引用的函数立即再次转换为指针。

这些都是从对象读取值或产生分别引用数组或函数开头的指针值。

除了lulz之外,这些dereferences行没有其他目的。

答案 3 :(得分:-4)

我理解的方式是

* is a pointer to a memory address
& is the value at the Memory address

*foo means pointer to foo memory address
**foo means *(*foo) *(foo memory address) This is a different value from *foo

它继续这样......