title: %p format specifier needs explicit cast to void* for all types but char* in printf
body: <p>I've read a lot of answers about the <code>%p</code> format specifier usage in C language here in Stack Overflow, but none seems to give an explanation as to why explicit cast to <code>void*</code> is needed for all types but <code>char*</code>.<br>
  I'm of course aware about the fact that this requirement to cast to or from <code>void*</code> is tied with the use of variadic functions (see first comment of this <a href="https://stackoverflow.com/a/9053677/5500552">answer</a>) while non-mandatory otherwise.  </p>
  
  <p>Here's an example :</p>
  
  <pre><code>int i;    
  printf ("%p", &amp;i);
  </code></pre>
  
  <p>Yields a warning about type incompatibility and that <code>&amp;i</code> shall be casted to <code>void*</code> (as required by the standard, see again <a href="https://stackoverflow.com/a/9053835/5500552">here</a>).</p>
  
  <p>Whereas this chunk of code compiles smoothly with no complaint about type casting whatsoever:</p>
  
  <pre><code>char * m = "Hello";    
  printf ("%p", m);
  </code></pre>
  
  <p>How does that come that <code>char*</code> is "relieved" from this imperative?</p>
  
  <p><strong><em>PS</em></strong>: It's maybe worth adding that I work on <em>x86_64</em> architecture, as pointer type size depends on it, and using <em>gcc</em> as compiler on linux with <code>-W -Wall -std=c11 -pedantic</code> compiling options.</p>