diff --git a/20230116/func-pointers-01.c b/20230116/func-pointers-01.c
new file mode 100644
index 0000000000000000000000000000000000000000..b2db5145e720b39de50d37e98365b02f1bb25ca2
--- /dev/null
+++ b/20230116/func-pointers-01.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+void hello (void)
+{
+  printf ("Hello, world!\n");
+}
+
+int main (void)
+{
+  hello ();
+  return 0;
+}
diff --git a/20230116/func-pointers-02.c b/20230116/func-pointers-02.c
new file mode 100644
index 0000000000000000000000000000000000000000..7c9d60ea9da2416b2f27b944dc500479825dd363
--- /dev/null
+++ b/20230116/func-pointers-02.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+
+void hello (void)
+{
+  printf ("Hello, world!\n");
+}
+
+int main (void)
+{
+  /* h ist ein Zeiger auf eine Funktion;
+     h soll auf die Funktion hello() zeigen; */
+  /* Merken: "*h ist eine Funktion." */
+  /* void *h (void) wäre eine Funktion, die keine Parameter bekommt
+                    und einen Zeiger auf void zurückgibt. */
+  void (*h) (void) = hello;
+  h ();
+  return 0;
+}
diff --git a/20230116/func-pointers-03.c b/20230116/func-pointers-03.c
new file mode 100644
index 0000000000000000000000000000000000000000..003591a933eb6123e6b92ac20c14454de17c2ac3
--- /dev/null
+++ b/20230116/func-pointers-03.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+void hello (void)
+{
+  printf ("Hello, world!\n");
+}
+
+int main (void)
+{
+  typedef void (*funcptr) (void);
+  funcptr h = hello;
+  h ();
+  return 0;
+}
diff --git a/20230116/func-pointers-04.c b/20230116/func-pointers-04.c
new file mode 100644
index 0000000000000000000000000000000000000000..403cb68fa3490e93301ad6ffe574a273ff39bc88
--- /dev/null
+++ b/20230116/func-pointers-04.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+
+typedef struct
+{
+  void (*greeting) (void);  // Zeiger auf Funktion, nicht initialisiert
+}
+object;
+
+void hello (void)
+{
+  printf ("Hello, world!\n");
+}
+
+int main (void)
+{
+  object o;
+
+  o.greeting = hello;  // "Konstruktor" - Initiallisieren des Funktions-Zeigers
+                       //Ohne Klammerpaar: Adresse der Funktion
+  o.greeting ();       // mit Klammerpaar: Funktion aufrufen
+
+  return 0;
+}
diff --git a/20230116/func-pointers-05.c b/20230116/func-pointers-05.c
new file mode 100644
index 0000000000000000000000000000000000000000..8870230b80a2d0e78017133ab339590d1ed33e4b
--- /dev/null
+++ b/20230116/func-pointers-05.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+
+typedef struct
+{
+  void (*greeting) (void);  // Zeiger auf Funktion, nicht initialisiert
+}
+object;
+
+void hello (void)
+{
+  printf ("Hello, world!\n");
+}
+
+int main (void)
+{
+  object *o;
+                        // FEHLER: Verwendung von "o" ohne daß "o" auf etwas Sinnvolles zeigt!
+  o->greeting = hello;  // "Konstruktor" - Initiallisieren des Funktions-Zeigers
+                        // Ohne Klammerpaar: Adresse der Funktion
+  o->greeting ();       // mit Klammerpaar: Funktion aufrufen
+
+  return 0;
+}
diff --git a/20230116/func-pointers-06.c b/20230116/func-pointers-06.c
new file mode 100644
index 0000000000000000000000000000000000000000..995bc6ea0b673144b57f0e2a587a60df6b676228
--- /dev/null
+++ b/20230116/func-pointers-06.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  void (*greeting) (void);  // Zeiger auf Funktion, nicht initialisiert
+}
+object;
+
+void hello (void)
+{
+  printf ("Hello, world!\n");
+}
+
+int main (void)
+{
+  object *o;
+
+  o = malloc (sizeof (object));   // Speicherplatz dynamisch erzeugen
+
+  o->greeting = hello;  // "Konstruktor" - Initiallisieren des Funktions-Zeigers
+                        // Ohne Klammerpaar: Adresse der Funktion
+  o->greeting ();       // mit Klammerpaar: Funktion aufrufen
+
+  return 0;
+}
diff --git a/20230116/func-pointers-07.c b/20230116/func-pointers-07.c
new file mode 100644
index 0000000000000000000000000000000000000000..a47689d0c3bd5c8d23594e90c31415df8c221c47
--- /dev/null
+++ b/20230116/func-pointers-07.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+
+typedef struct
+{
+  void (*greeting) (void);  // Zeiger auf Funktion, nicht initialisiert
+}
+object;
+
+void hello (void)
+{
+  printf ("Hello, world!\n");
+}
+
+int main (void)
+{
+  object *o;
+
+  object apfel;  // Speicherplatz innerhalb von main() reservieren
+  o = &apfel;    // Zeiger darauf zeigen lassen
+
+  o->greeting = hello;  // "Konstruktor" - Initiallisieren des Funktions-Zeigers
+                        // Ohne Klammerpaar: Adresse der Funktion
+  o->greeting ();       // mit Klammerpaar: Funktion aufrufen
+
+  return 0;
+}
diff --git a/20230116/func-pointers-08.c b/20230116/func-pointers-08.c
new file mode 100644
index 0000000000000000000000000000000000000000..0b28bed135607997794ef02d3ddc3c823cbe3515
--- /dev/null
+++ b/20230116/func-pointers-08.c
@@ -0,0 +1,36 @@
+#include <stdio.h>
+
+typedef struct
+{
+  void (*greeting) (void);  // Zeiger auf Funktion, nicht initialisiert
+}
+object;
+
+void hello_apple (void)
+{
+  printf ("Hello, apple!\n");
+}
+
+void hello_pear (void)
+{
+  printf ("Hello, pear!\n");
+}
+
+int main (void)
+{
+  object *a;
+  object *b;
+
+  object apfel;  // Speicherplatz innerhalb von main() reservieren
+  a = &apfel;    // Zeiger darauf zeigen lassen
+  a->greeting = hello_apple;   // "Konstruktor": virtuelle Methode initialisieren
+
+  object birne;  // Speicherplatz innerhalb von main() reservieren
+  b = &birne;    // Zeiger darauf zeigen lassen
+  b->greeting = hello_pear;    // "Konstruktor": virtuelle Methode initialisieren
+
+  a->greeting ();
+  b->greeting ();
+
+  return 0;
+}
diff --git a/20230116/func-pointers-09.c b/20230116/func-pointers-09.c
new file mode 100644
index 0000000000000000000000000000000000000000..25ca1bba9b9d775134383d0078611ed5dd890911
--- /dev/null
+++ b/20230116/func-pointers-09.c
@@ -0,0 +1,35 @@
+#include <stdio.h>
+
+typedef struct
+{
+  void (*greeting) (void);  // Zeiger auf Funktion, nicht initialisiert
+}
+object;
+
+void hello_apple (void)
+{
+  printf ("Hello, apple!\n");
+}
+
+void hello_pear (void)
+{
+  printf ("Hello, pear!\n");
+}
+
+int main (void)
+{
+  object *o[2];  // Array mit 2 Zeigern auf Objekte
+
+  object apfel;  // Speicherplatz innerhalb von main() reservieren
+  o[0] = &apfel;    // Zeiger darauf zeigen lassen
+  o[0]->greeting = hello_apple;   // "Konstruktor": virtuelle Methode initialisieren
+
+  object birne;  // Speicherplatz innerhalb von main() reservieren
+  o[1] = &birne;    // Zeiger darauf zeigen lassen
+  o[1]->greeting = hello_pear;    // "Konstruktor": virtuelle Methode initialisieren
+
+  for (int i = 0; i < 2; i++)
+    o[i]->greeting ();
+
+  return 0;
+}
diff --git a/20230116/func-pointers-10.c b/20230116/func-pointers-10.c
new file mode 100644
index 0000000000000000000000000000000000000000..10ad166342d4cf47c9df9e06e8f78211e5776be9
--- /dev/null
+++ b/20230116/func-pointers-10.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  void (*greeting) (void);  // Zeiger auf Funktion, nicht initialisiert
+}
+object;
+
+void hello_apple (void)
+{
+  printf ("Hello, apple!\n");
+}
+
+void hello_pear (void)
+{
+  printf ("Hello, pear!\n");
+}
+
+int main (void)
+{
+  object *o[2];  // Array mit 2 Zeigern auf Objekte
+
+  o[0] = malloc (sizeof (object));  // "Konstrutor": Speicherplatz dynamisch reservieren
+  o[0]->greeting = hello_apple;     // "Konstruktor": virtuelle Methode initialisieren
+
+  o[1] = malloc (sizeof (object));  // "Konstrutor": Speicherplatz dynamisch reservieren
+  o[1]->greeting = hello_pear;      // "Konstruktor": virtuelle Methode initialisieren
+
+  for (int i = 0; i < 2; i++)
+    o[i]->greeting ();
+
+  return 0;
+}
diff --git a/20230116/hp-20230116.txt b/20230116/hp-20230116.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d53358e95adc81494c9b3d1a4291614c119008a9
--- /dev/null
+++ b/20230116/hp-20230116.txt
@@ -0,0 +1,19 @@
+Klausur-Themen, 16.01.2023, 13:57:20
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - Seiteneffekte
+ - Arrays, Zeiger, Strings
+ - Speicherzellen
+ - Bit-Manipulation
+ - Endianness
+ - Alignment
+ - Algorithmen, Landau-Symbol
+ - Objekte, Zeiger auf Funktionen
+
+--> Es ist mal wieder Zeit für:
+     - Seiteneffekte
+     - Mikrocontroller
+
+Zeiger, 16.01.2023, 11:30:23
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - auf Funktionen
+ - auf Structs und Unions
diff --git a/20230116/pointers-01.c b/20230116/pointers-01.c
new file mode 100644
index 0000000000000000000000000000000000000000..230e8ed7d6dc91e2104c08028e2c58d8f654afa3
--- /dev/null
+++ b/20230116/pointers-01.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+int main (void)
+{
+  int a = 7;
+  int b = 13;
+  int *p = &a;
+  printf ("*p = %d\n", *p);
+  p = &b;
+  printf ("*p = %d\n", *p);
+  return 0;
+}
diff --git a/20230116/pointers-01.pas b/20230116/pointers-01.pas
new file mode 100644
index 0000000000000000000000000000000000000000..1fe7afcbee05de4cd407d232b019e0906931fe2e
--- /dev/null
+++ b/20230116/pointers-01.pas
@@ -0,0 +1,12 @@
+program Pointers;
+
+var
+  a: Integer = 7;
+  b: Integer = 13;
+  p: ^Integer = @a;
+
+begin
+  WriteLn ('p^ = ', p^);
+  p := @b;
+  WriteLn ('p^ = ', p^)
+end.
diff --git a/20230116/pointers-02.c b/20230116/pointers-02.c
new file mode 100644
index 0000000000000000000000000000000000000000..b551c9c9911df26b7076ab833306b9715ea985b6
--- /dev/null
+++ b/20230116/pointers-02.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+int main (void)
+{
+  int a = 7;
+  int b = 13;
+  int *p = &a;
+  printf ("*p = %d\n", *p);
+  *p = &b;  /* falsch */
+  printf ("*p = %d\n", *p);
+  return 0;
+}
diff --git a/20230116/pointers-03.c b/20230116/pointers-03.c
new file mode 100644
index 0000000000000000000000000000000000000000..b330a5f6f3eafaed6cbdc608f98aee7652ecc13d
--- /dev/null
+++ b/20230116/pointers-03.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+
+int main (void)
+{
+  int a = 7;
+  int b = 13;
+  int *p;
+  p = &a;
+  printf ("*p = %d\n", *p);
+  *p = &b;  /* falsch: Zuweisung der Speicheradresse von b an die Zahl a,
+                       weil p zu diesem Zeitpunkt auf a zeigt */
+  printf ("*p = %d\n", *p);
+  printf ("a = %d\n", a);
+  return 0;
+}
diff --git a/20230116/struct-pointers-01.c b/20230116/struct-pointers-01.c
new file mode 100644
index 0000000000000000000000000000000000000000..9837cbfbaa89bbab67cc31948927e637d6c3d84b
--- /dev/null
+++ b/20230116/struct-pointers-01.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int a;
+  int b;
+}
+data;
+
+int main (void)
+{
+  data d;
+  d.a = 7;
+  d.b = 13;
+  data *p = &d;
+  printf ("*p = { %d, %d }\n", *p.a, *p.b);
+  return 0;
+}
diff --git a/20230116/struct-pointers-02.c b/20230116/struct-pointers-02.c
new file mode 100644
index 0000000000000000000000000000000000000000..d6527ad8983e8db8f3b2a0f86416d577fd8dd85a
--- /dev/null
+++ b/20230116/struct-pointers-02.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int a;
+  int b;
+}
+data;
+
+int main (void)
+{
+  data d;
+  d.a = 7;
+  d.b = 13;
+  data *p = &d;
+  printf ("*p = { %d, %d }\n", (*p).a, (*p).b);
+  return 0;
+}
diff --git a/20230116/struct-pointers-03.c b/20230116/struct-pointers-03.c
new file mode 100644
index 0000000000000000000000000000000000000000..2aebb0624adead6acfb2d0017587239faeee343d
--- /dev/null
+++ b/20230116/struct-pointers-03.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int a;
+  int b;
+}
+data;
+
+int main (void)
+{
+  data d;
+  d.a = 7;
+  d.b = 13;
+  data *p = &d;
+  printf ("*p = { %d, %d }\n", p->a, p->b);
+  return 0;
+}
diff --git a/20230116/struct-pointers-03.pas b/20230116/struct-pointers-03.pas
new file mode 100644
index 0000000000000000000000000000000000000000..2c998ff1410a786ab03eaa39757971d4f5b14e05
--- /dev/null
+++ b/20230116/struct-pointers-03.pas
@@ -0,0 +1,17 @@
+program StructPointers;
+
+type
+  data = record
+    a, b: Integer
+  end;
+
+var
+  d: data;
+  p: ^data;
+
+begin
+  d.a := 7;
+  d.b := 13;
+  p := @d;
+  WriteLn ('p^ = { ', p^.a, ', ', p^.b, ' }')
+end.
diff --git a/20230116/struct-pointers-04.c b/20230116/struct-pointers-04.c
new file mode 100644
index 0000000000000000000000000000000000000000..ca2c30cffd0bac3a004d74d0cbf46ffe8e152674
--- /dev/null
+++ b/20230116/struct-pointers-04.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int a;
+  int b;
+}
+data;
+
+int main (void)
+{
+  data d;
+  d.a = 7;
+  d.b = 13;
+  printf ("d = { %d, %d }\n", d->a, d->b);
+  return 0;
+}
diff --git a/20230116/struct-pointers-05.c b/20230116/struct-pointers-05.c
new file mode 100644
index 0000000000000000000000000000000000000000..d98b8f23fc7b88fc1570c32f336e6377d08f0340
--- /dev/null
+++ b/20230116/struct-pointers-05.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int a;
+  int b;
+}
+data;
+
+int main (void)
+{
+  data d;
+  d.a = 7;
+  d.b = 13;
+  printf ("d = { %d, %d }\n", d.a, d.b);
+  return 0;
+}