title: Is a conversion to `void *` required before converting a pointer to `uintptr_t` and vice versa?
body: <p>Section <strong>7.18.1.4</strong> of the C99 standard states:</p>
  
  <blockquote>
    <p>The following type designates an unsigned integer type with the property that any valid pointer to <strong><code>void</code></strong> can be converted to this type, then converted back to pointer to <strong><code>void</code></strong>, and the result will compare equal to the original pointer:</p>
    
    <p><strong><code>uintptr_t</code></strong></p>
  </blockquote>
  
  <p>Does this mean that only <code>void *</code> types can be converted to <code>uintptr_t</code> and back without changing the value of the original pointer?</p>
  
  <p>In particular, I would like to know if the following code is required to use <code>uintptr_t</code>:</p>
  
  <pre><code>int foo = 42;
  void * bar = &amp;foo;
  uintptr_t baz = bar;
  void * qux = baz;
  int quux = *(int *)qux; /* quux == foo == 42 */
  </code></pre>
  
  <p>Or if this simpler version is guaranteed by the C99 standard to result in the same effect:</p>
  
  <pre><code>int foo = 42;
  uintptr_t bar = &amp;foo;
  int baz = *(int *)bar; /* baz == foo == 42 */
  </code></pre>
  
  <p><strong>Is a conversion to <code>void *</code> required before converting a pointer to <code>uintptr_t</code> and vice versa?</strong></p>