title: Why do function pointer definitions work with any number of ampersands '&' or asterisks '*'?
body: <p>Why do the following work?</p>
  
  <pre><code>void foo() {
      cout &lt;&lt; "Foo to you too!\n";
  };
  
  int main() {
      void (*p1_foo)() = foo;
      void (*p2_foo)() = *foo;
      void (*p3_foo)() = &amp;foo;
      void (*p4_foo)() = *&amp;foo;
      void (*p5_foo)() = &amp;*foo;
      void (*p6_foo)() = **foo;
      void (*p7_foo)() = **********************foo;
  
      (*p1_foo)();
      (*p2_foo)();
      (*p3_foo)();
      (*p4_foo)();
      (*p5_foo)();
      (*p6_foo)();
      (*p7_foo)();
  }
  </code></pre>