C++ 什么';函数调用中使用多个星号是什么意思?

C++ 什么';函数调用中使用多个星号是什么意思?,c++,c,function-pointers,dereference,function-call,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++中都允许使用?,因为 */COD>操作符期望地址值。每当需要一个

我想不出在函数调用中使用多个星号的任何实际用途:

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++中都允许使用?

,因为<代码> */COD>操作符期望地址值。每当需要一个值时(与对象或函数glvalue相反),在操作数上应用左值到右值、函数到指针和数组到指针的转换。因此,当再次取消引用时,被取消引用的函数会立即再次转换为指针

它们要么从对象读取值,要么生成一个指针值,分别指向数组或函数的开头

这些取消引用的行没有其他用途,只是为了让它平静下来

<>为什么这个东西在C和C++中都允许使用?< /P>

我不能为C++说话,但是对于C,至少函数指定符被转换成指针:

6.3.2.1-4

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

应用间接运算符可生成函数指示符:

6.5.3.2-3

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

因此,无论您应用间接运算符多少次,都会得到相同的结果:一个函数指示符会立即转换为指针



我认为这样做很少或没有用。

< P> C和C++中的一个标准转换是指针转换的函数;当函数名出现在表达式中时,可以将其转换为指向该函数的指针。因此:

  • foo
    相当于
    &foo
  • *foo
    相当于
    *(&foo)
    ,或
    foo
  • **foo
    等同于
    **(&foo)
    ,或
    *foo
    ,或
    foo
等等


这意味着您可以合法地在函数名之前添加任意数量的
*
,而无需更改其含义。不过,没有理由这么做。

我的理解是

* 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

它仍然是这样的…

为了C模糊代码的竞争,它被明确地允许。可能最初的编码者是按代码的字符而不是按字符付费的line@TomTanner你连星号之间都不能换行吗?那真是太好了;)你可以在里面放任意多的空白