title: Unclear relationship between pointer dereferencing and casting in a specific scenario
body: <p>I have the following Cpp funtion:</p>
  
  <pre><code>u_long stringIpV4ToBinary(const char * ipv4)
  {
      u_long * buff[1];
      int ret = InetPton(AF_INET, ipv4, &amp;buff);
      if (ret == -1) return 1;
      if (ret == 0) return 1; // more handling needs to be added
  
  // return ntohl(*buff[0]);           // crash, no warning
  // return ntohl((*buff)[0]);         // same meaning above (??) crash, no warning
  // return ntohl(**buff);             // crash, no warning
  // return ntohl(*(buff[0]));         // crash, no warning
  // return ntohl(*(u_long*)buff[0]);  // crash, no warning
  // return ntohl((u_long)buff[0]);    // works, but produces warnings:: 'type cast': truncation from 'u_long *' to 'u_long'
  // return ntohl(*(u_long*)&amp;buff);    // works
  // return ntohl(*(u_long*)&amp;buff[0]); // works
  // return ntohl(*(u_long*)buff[0]);  // crash, no warning
  // return ntohl(*(u_long*)buff);     // works
  }
  </code></pre>
  
  <p>I have spent some time trying to extract the value of buff that I need to pass to <code>ntohl()</code> (so you can ignore the first couple of lines). I was playing around with <code>*buff[0]</code> <code>*buff</code> and others, w/o realizing that I need to cast the value of the first element of the array (<code>&amp;buff[0]</code>, <code>buff</code> or <code>&amp;buff</code>).</p>
  
  <p><strong>Question</strong>: why do I need to cast the retrieved value to <code>(u_long*)</code> and then deference the pointer? Is it ambiguous or unclear to @ runtime that the value held in the <code>buff[0]</code> will be a of type <code>u_long *</code> ?  My expectation was that <code>ntohl(**buff)</code> - (buff is the array name, that decays into a pointer and since the array is of u_long pointers itself) double dereferencing should suffice.</p>