函数调用中多个星号的用法是什么?

我不能想象在函数调用中多个星号的实际使用:

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 ++中都是允许的?

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

我不能说C ++,但是对于C来说,至less一个函数标识符被转换为一个指针:

6.3.2.1 – 4

函数指示符是具有函数types的expression式。 除了sizeof运算符的操作数或者一元&运算符以外,函数指示符的types为函数返回types,被转换为具有指向函数返回types指针的expression式。

应用间接运算符产生一个函数标识符:

6.5.3.2 – 3

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

所以无论你使用间接运算符多less次,你都会得到相同的结果:一个函数标识符被立即转换成一个指针。


在我看来,这样做几乎没有用处。

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

  • foo相当于&foo
  • *foo等同于*(&foo)foo
  • **foo等价于**(&foo)*foofoo

等等。

这意味着您可以在函数名称之前合法添加尽可能多的* ,而不必改变其含义。 虽然没有理由这样做。

因为*运算符期望地址值。 并且,无论何时需要一个值(与对象或函数glvalue相对),左值到右值,函数指针和数组到指针转换都应用于操作数。 所以解除引用的函数在再次解除引用时立即再次转换为指针。

这些全部或者从对象读取值或者分别产生指向数组或函数的开始的指针值。

除了它的消失之外,这些行的解引用是没有意义的。

我理解的方式是

 * 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 

它继续像那样…