Neuinterpretation - reinterpret_cast

Ein reinterpret_cast wird wie folgt aufgebaut

reinterpret_cast< neuerTyp >( object )

Zurückgegeben wird ein Objekt im gewünschten neuerTyp.

reinterpret_cast ist der ausdrückliche Wunsch, Daten in anderer Form zu betrachten. Es entspricht damit dem C-Style-Cast am ehesten, da es vollkommen ohne Rücksicht darauf, welche Daten betrachtet werden, den Datentyp verändert.

Es eignet sich damit, inkompatible Datentypen in einer anderen Form darzustellen.

Beispiele:

int main(int argc, char **argv)
{
  char ipAddress[4] = { 192, 168, 1, 1 };
  int  ipToken      = *reinterpret_cast< int * >( ipAddress );
 
  printf( "Token: %d\n", ipToken );
 
  unsigned char * ip = reinterpret_cast< unsigned char * >( &ipToken );
 
  printf( "IpAdress: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3] ); 
 
  return 0;
}

Das Programm liefert das Ergebnis:

Token: 16885952
IpAdress: 192.168.1.1

Auf ipToken wird der Wert kopiert, den das Array { 192, 168, 1, 1 } darstellen würde, wenn es ein Integer wäre. ip selbst ist nur ein Zeiger auf ein Array von (unsigned int) und es zeigt auf den Integer. Obwohl der Integer kein unsigned-char-Array ist, akzeptiert der Compiler den Wunsch des Entwicklers, das Integer als Array zu betrachten.

Solange der Entwickler weiß, was er tut, funktioniert das. Allerdings gibt es auch hier oftmals bessere Methoden. Für dieses Beispiel eignet sich beispielsweise ein Unions.

Das folgende Programm gibt exakt die gleiche Information aus, das Unions beschreibt aber viel besser, welche Perspektiven der Entwickler auf den Datensatz wünscht und hilft auch dabei, den Größe des größtmöglichen Datensatzes zu ermitteln:

int main(int argc, char **argv)
{
  union IpConverter
  {
	  unsigned char byteArray[4];
	  int           token;
  };
 
  IpConverter ip;
  ip.token = 16885952;
 
  printf( "Token: %d\n", ip.token );
  printf( "IpAdress: %d.%d.%d.%d\n", ip.byteArray[0], ip.byteArray[1]
                                   , ip.byteArray[2], ip.byteArray[3] ); 
 
  return 0;
}