C++ のキャストと void ポインタ

unsigned int uia[8];
unsigned char uca[8];

void test() {
  void* vp;
  unsigned int* uip;
  unsigned char* ucp;

  uip = uia;
  ucp = uca;

  vp = uia;
  // uip = vp; // Error!
  uip = static_cast<unsigned int*>(vp);

  vp = uca;
  // ucp = vp; // Error!
  ucp = static_cast<unsigned char*>(vp);

  // ucp = uia; // Error!
  // ucp = static_cast<unsigned char*>(uia); // Error!
  ucp = reinterpret_cast<unsigned char*>(uia);

  // uip = uca; // Error!
  // uip = static_cast<unsigned int*>(uca); // Error!
  uip = reinterpret_cast<unsigned int*>(uca);

  vp = uia;
  ucp = static_cast<unsigned char*>(vp);

  vp = uca;
  uip = static_cast<unsigned int*>(vp);

  ucp = static_cast<unsigned char*>(static_cast<void*>(uia));
  uip = static_cast<unsigned int*>(static_cast<void*>(uca));
}