MODULE PointerBasics4; IMPORT Read, Write, Conclusions; TYPE Liste = POINTER TO Elements; Elements = RECORD content: INTEGER; next: Liste; END; VAR anchor, pointer, temp: Liste; BEGIN NEW(pointer); pointer.content := 10; pointer.next := NIL; anchor := pointer; (* Folgende Zeilen wuerden zu einem Core Dump fuehren, da * anchor.next.next gar nicht definiert ist... *IF (anchor.next.next # NIL) THEN * ; *END; *) (* Jetzt wird die zweite Bediengung gar nicht mehr ueberprueft, * da die erste Bediengung bereits zutrifft! Deshalb kommt es * hier auch zu keiner einer Fehlermeldung... *) IF (anchor.next # NIL) & (anchor.next.next # NIL) THEN Write.Ln; Write.String("Anchor.next ungleich NIL"); Write.Ln; ELSE Write.Ln; Write.String("Anchor.next gleich NIL"); Write.Ln; END; (* Weiteres Element einfuegen! *) NEW(pointer); pointer.content := 20; pointer.next := NIL; anchor.next := pointer; Write.Ln; Write.String("anchor.content:"); Write.Int(anchor.content,3); Write.Ln; Write.String("anchor.next.content:"); Write.Int(anchor.next.content,3); temp := anchor; (* temp UNABHAENGIG von anchor!!! * * temp und anchor zeigen auf das gleiche Element, sind aber 2 * unabhaengige Zeiger, d.h. wenn sich der Inhalt des Elements * aendert, zeigen beide Zeiger zwar auf diesen geaenderten Inhalt, * aber: einer der beiden Zeiger kann geloescht werden, ohne dass * der Zugriff auf den Inhalt des Elements verloren geht, da der * andere Zeiger ja noch auf dieses Element zeigt... *) Write.Ln; Write.Ln; Write.String("temp.content:"); Write.Int(temp.content,3); Write.Ln; Write.String("anchor.content:"); Write.Int(anchor.content,3); (* Inahlt aendern... *) temp.content := 30; Write.Ln; Write.Ln; Write.String("temp.content:"); Write.Int(temp.content,3); Write.Ln; Write.String("anchor.content:"); Write.Int(anchor.content,3); Write.Ln; (* temp.next GLEICH anchor.next * * ... wird allerdings einer der beiden next Zeiger geloescht * bzw. umgebogen, so kann auf das Element, auf das anchor.next * bzw. temp.next zeigt, nicht mehr zugegriffen werden, da * anchor.next = temp.next gilt (Ein identischer Zeiger)! *) Write.Ln; Write.String("anchor.next.content:"); Write.Int(anchor.next.content,3); Write.Ln; Write.String("temp.next.content:"); Write.Int(temp.next.content,3); Write.Ln; Write.Ln; Write.String("Setzt man temp.next = NIL, "); temp.next := NIL; Write.Ln; Write.String("dann wuerde der Zugriff auf "); Write.Ln; Write.String("anchor.next.content"); Write.Ln; Write.String("zu einem Core Dump fuehren!"); (* Dann wuerden folgende Zeilen zu einem Core Dump fuehren: *Write.Ln; *Write.String("anchor.next.content:"); *Write.Int(anchor.next.content,3); *) Write.Ln; Write.Ln; END PointerBasics4.