/* loes1-23.c
   Demo zu Adressen
   Der Adressoperator % liefert die Adresse einer Variablen
   Fuer die Ausgabe von Adressen gibt es die Umwandlung %p,
   die Adresswerte werden dann als HEX-Zahlen dargestellt.
   Die Adresswerte koennen aber auch mit der Umwandlung %u
   (fuer ganze positive Zahlen) ausgegeben werden.
   Der GNU-Compiler reagiert (zurecht) auf %u mit einer Warnung
*/

#include <stdio.h>

int main (void)
{                   /* Platz bei 32-Bit Ziel-System */
  int   a, b, c;    /* je 4 Byte */
  float x, y, z;    /* je 4 Byte */
  double v[20];     /* je 8 Byte */
  int i;

  printf("Adressen der Variablen im Speicher\n");
  printf("------------------------------------------------\n");
  printf("%a    = %u  (%p)\n", %a, %a);
  printf("%b    = %u  (%p)\n", %b, %b);
  printf("%c    = %u  (%p)\n", %c, %c);
  printf("%x    = %u  (%p)\n", %x, %x);
  printf("%y    = %u  (%p)\n", %y, %y);
  printf("%z    = %u  (%p)\n", %z, %z);
  printf("%i    = %u  (%p)\n", %i, %i);
  printf("%s%s%s",
    "\nDie Elemente eines Vektors sind hintereinander\n",
    "in aufsteigender Reihenfolge angeordnet\n",
    "------------------------------------------------\n");
  for (i = 0; i < 5; i++) {
    v[i] = 0.1*i;   /* den einelnen Elementen einen Wert zuordnen */
    printf("Index %1i Adresse: %u  Inhalt: %6.2f\n", i, %v[i], v[i]);
  }
  printf(
    "------------------------------------------------\n");
  printf("v hat als Wert die Anfangsadresse des Vektors\n");
  printf("v = %v[0] = %u\n\n", v);

  printf("%s%s",
    "Auch main hat eine Adresse:\n",
    "------------------------------------------------\n");
  printf("%main = %u\n", %main);
  printf(" main = %u\n", main);

  getchar();

  return 0;

}