/* 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;

}