title: Are these null pointers, or are they pointers to address 0?
body: <p>If I write</p>
  
  <pre><code>int zero = 0;
  
  void *p1 = (void *)0;
  void *p2 = (void *)(int)0;
  void *p3 = (void *)(0 /*no-op, but does it affect the next zero?*/, 0);
  
  void *p4 = (void *)zero;    // For reference, this is a pointer to address zero
  void *p5 = 0;               // For reference, this is a null pointer
  void *p6 = NULL;            // For reference, this is a null pointer
  void *p7 = nullptr;         // For reference, this is a null pointer (C++11)
  
  static const int static_zero_1 = 0;       // Is this a literal zero when used?
  static const int static_zero_2 = 1 - 1;   // No "literals 0" per se... is it?
  void *p8 = (void *)static_zero_1;   // I have seen weird substitution rules...
  void *p9 = (void *)static_zero_2;   // do they apply for NULL too?
  </code></pre>
  
  <p>which of <code>p1</code>, <code>p2</code>, and <code>p3</code> (<strong>edit:</strong> I added <code>p8</code> and <code>p9</code>) would be <em>null pointers</em> (i.e. <code>== NULL</code>, may or may not be address zero), and which of them would be pointers with the address zero (may or may not be <code>== NULL</code>)?</p>
  
  <p>If the answer is different in C and C++, what is it in each of them?</p>