ARRAY oder FELD oder VEKTOR

Slides:



Advertisements
Ähnliche Präsentationen
Imperative Programmierung
Advertisements

Imperative Programmierung
Forschungszentrum caesar
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
der Universität Oldenburg
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
SWITCH - Anweisung.
Verzweigung oder bedingte Anweisung Weiter mit PP.
Datentyp- umwandlung. Literale sind: Bezeichner mit einem festen Wert wie z.B:
IF-ELSE-IF-Ketten Weiter mit PP..
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
ARRAY oder FELD oder VEKTOR
Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben...
Programmier-sprache Java Weiter mit PP..
Ein Beispiel in Java.
Erweiterte Zuweisungskompatibilität
Dynamischer Speicher und Struktur
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Parameterübergabe von zweidimensionalen Feldern in Funktionen.
WHILE - Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Polymorphie (Vielgestaltigkeit)
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
DO...WHILE Anweisung.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung der Vorwoche Variable stehen für (einen) Wert, der sich im Programmablauf ändern kann. Variablen besitzen einen.
Zusammenfassung Vorwoche
DVG Ausnahmen1 Ausnahmen. DVG Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht.
DVG Klassen und Objekte
© 2005 Pohlig - Taulien Datenströme GK Informatik 1 Datenströme.
Java programmieren mit JavaKara
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
CuP - Java Eingabe über Tastatur, AudioClips, überschreiben, Quiz Montag, 18. November 2002.
Variablenkonzept Klassisch, in Java Basistyp
Die Klasse String und ihre Methoden
CuP - Java Neunte Vorlesung Entspricht Kapitel 4.2 und 5 des Skriptums
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
Programmiervorkurs WS 2014 Referenzdatentypen
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
3. Beschreibung von Abläufen durch Algorithmen 3.4 Zufall
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Ausnahmen Vorlesung besteht aus zwei Teilen Programmierung (4 SWS)
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Konstruktoren.
ARRAY oder FELD oder VEKTOR
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
 Präsentation transkript:

ARRAY oder FELD oder VEKTOR

Aufgabe: Drei über Tastatur eingegebene ganzzahlige Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden.

import java.io.*; public class MainArray1{ public static void main(String argv[]) throws IOException{ int z1, z2, z3; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in));

System. out. println("1. Zahl eingeben"); mystr = myinput System.out.println("1. Zahl eingeben"); mystr = myinput.readLine(); z1=Integer.parseInt(mystr); System.out.println("2. Zahl eingeben"); mystr = myinput.readLine(); z2=Integer.parseInt(mystr); System.out.println("3. Zahl eingeben"); mystr = myinput.readLine(); z3=Integer.parseInt(mystr); System.out.println(z3+" "+z2+" "+z1+" "); } }

Schreibaufwendige Lösung ! Was ist der Nachteil ? Schreibaufwendige Lösung !

keine "nächste" Variable: z1  z2  z3 Warum nicht mit Schleife lösbar ? keine "nächste" Variable: z1  z2  z3

Man benötigt: Eine Variable, die aus mehreren Zellen (Elementen, Komponenten) besteht und deshalb gleichzeitig mehrere Werte speichern kann. Dies ist eine indizierte Variable, ein sogenanntes Feld (Array, Vektor).

Der Index der ersten Zelle (Element) ist 0 13 17 19 23 27 1 2 3 4 Der Index der ersten Zelle (Element) ist 0 Die Feldlänge ist 5

Java-Syntax

int[] v; ... v = new int[3]; Variable deklarieren Speicher für Variable reservieren Diese Feldlänge ist (nach dem Anlegen des Speichers) eine Konstante und darf danach nicht mehr verändert werden. Sie kann NICHT während des Programmlaufs (z.B. durch den Anwender über Tastatur) verändert werden !!! Länge des Feldes: KONSTANTE !!! Variablenname Datentyp: Jede Zelle hat den gleichen Datentyp

Statt dieser Schreibweise wäre auch folgendes möglich: int[] v; ... v = new int[3]; Statt dieser Schreibweise wäre auch folgendes möglich:

... v = new int[3];

Diese Schreibweise wird hier nicht so oft verwendet, weil... int v[]; ... v = new int[3]; Diese Schreibweise wird hier nicht so oft verwendet, weil...

Ein Feld ist in Java als ein Objekt realisiert. Merke: Ein Feld ist in Java als ein Objekt realisiert. Bei dieser Schreibweise sieht man besser, dass int[] eine Klasse und v eine Objektvariable ist. int[] v; ... v = new int[3];

public class MainArray3{ public static void main(String import java.io.*; public class MainArray3{ public static void main(String argv[]) throws IOException{ int[] v; int x; int y; v = new int [3]; // irgendwelche Anweisungen } Erst in der nächsten Anweisung bekommt v einen Wert (Referenzwert = Adresse) zugewiesen WICHTIG v, x, y sind lokale Variablen. Deshalb haben sie an dieser Stelle einen undefinierten, dem Programmierer unbekannten Wert.

Merke Wenn ein Feld erzeugt wird (Speicher reserviert), werden alle Elemente dieses Feldes automatisch mit den Standartwerten belegt, d.h:

standardmäßige Vorbelegung Datentyp standardmäßige Vorbelegung boolean false char \u0000 byte short int long 0L float 0.0f double 0.0 Referenz null

Zur Wiederholung: Beim Objekt ist es analog. Dort werden sämtliche Attribute mit den Standardwerten initialisiert.

Welchen Wert haben x, y und die Elemente von v an dieser Stelle ? import java.io.*; public class MainArray3{ public static void main(String argv[]) throws IOException{ int[] v; int x; int y; v = new int [3]; ... } Welchen Wert haben x, y und die Elemente von v an dieser Stelle ? In diesem Programm werden an dieser Stelle in der nächsten Folie bestimmte Anweisungen gemacht. Aber zuerst die Frage:

int main(){ v x y ? ? 19 ? ? v[2]=19; 17 19 ? ? v[0]=17; 17 13 19 ? ? v[1]=13; 17 13 19 2 ? x=2; 17 13 23 2 ? v[x]=23; 17 13 23 2 13 y=v[1]; 17 13 13 2 13 v[x]=y;

Aufgabe Welche Anweisungen des folgenden Programms sind semantisch falsch (Compiler meldet keinen Fehler, aber Interpreter)?

import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ int len; int[] v; String mystr; BufferedReader myinput = new BufferedReader(newInputStreamReader (System.in)); System.out.println("Bitte Länge eingeben"); mystr = myinput.readLine(); len=Integer.parseInt(mystr); v = new int [len]; v[len-1]=13; len=len+15; System.out.println(v[len-1]+" "); } Angenommen, der Anwender gibt über Tastatur die Zahl 10 ein. Wo gibt es dann Probleme? Das Feld v hat die Länge 10. v[9] bekommt den Wert 13 zugewiesen. Das ist korrekt. len hat an dieser Stelle den Wert 25. Das ist auch noch korrekt. An dieser Stelle wird auf das 24. Element des Feldes zugegriffen (also auf nicht reservierten Speicher). Das ist nicht korrekt, weil das Feld nur die Länge 10 hat.

Deklaration und Speicher anlegen in einer Anweisung

import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ int[] v; v = new int [7]; } Statt der Deklaration und dem Anlegen von Speicher, kann man dies in einer Anweisung gemeinsam machen ...

import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ }

import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ int[] v = new int[7]; } ... eine Anweisung

Deklaration, Speicher anlegen und initialisieren in einer Anweisung

import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ int[] v = {10, 20, 30}; } Da hier 3 Elemente angegeben werden, hat das Feld die Länge 3

import java.io.*; public class MainArray4{ public static void main(String argv[]) throws IOException{ int[] v; v = new int [7]; } WICHTIG v ist eine lokale Variable. Deshalb hat v an dieser Stelle einen undefinierten, dem Programmierer unbekannten Wert. Erst in der nächsten Anweisung bekommt v einen Wert (Referenzwert = Adresse) zugewiesen

Was veranlasst also der folgende Programmausschnitt im Arbeitsspeicher?

Weil v eine lokale Variable ist, ist der Wert undefiniert. Adresse Wert ... ? hat natürlich einen konkreten, uns unbekannten Wert, der mehrere Bytes groß ist (und nicht wie hier angedeutet nur 1 Byte verbraucht). Diese Interna brauchen uns nicht zu interessieren. v 0120 ? ... Ein Zeiger ist eine Variable, deren Wert die Anfangsadresse eines Speicherplatzes (z.B. einer Variable oder Objekt) ist. Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für den Zeiger (Referenz, Verweis, Pointer) mit Namen v reserviert. Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ int[] v; v=new int[2]; } Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. Was veranlasst diese Deklaration im Arbeitsspeicher ?

Adresse Wert ... Adresse Wert ... Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. v 0120 ? 0470 ... Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das v zeigen soll. Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ int[] v; v=new int[2]; } Wie viel Byte Speicher werden reserviert? (Antwort nächste Folie) Aus Platzgründen wird hier der Arbeitsspeicher auf 2 Tabellen verteilt, obwohl eigentlich der ganze Speicher durch eine Tabelle dargestellt wird!

Adresse Wert ... Adresse Wert ... 0471 0472 0473 0474 0475 0476 0477 v 0120 ? 0470 ... Das Feld besteht aus 2 integer-Werten. Für jeden werden 4 Byte reserviert. Standardmäßig wird ein für einen integer-Wert erzeugter Speicher mit 0 vorbelegt. Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ int[] v; v=new int[2]; } Welchen Wert muss v bekommen, damit es auf das gerade angelegte Objekt zeigt?

Adresse Wert ... Adresse Wert ... 0471 0472 0473 0474 0475 0476 0477 v 0120 0470 ... Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ int[] v; v=new int[2]; }

Adresse Wert ... Adresse Wert ... 0471 0472 0473 0474 0475 0476 0477 v 0120 0470 0470 ... Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. public static void main(...){ int[] v; v=new int[2]; }

Merke Wenn ein Feld erzeugt wird (Speicher reserviert), werden alle Elemente dieses Feldes automatisch mit den Standartwerten belegt, d.h:

standardmäßige Vorbelegung Datentyp standardmäßige Vorbelegung boolean false char \u0000 byte short int long 0L float 0.0f double 0.0 Referenz null

Bemerkung: Dass für einen integer-Wert 4 Byte reserviert werden, steht nicht in der JLS (dort steht nur der Wertebereich für integer). Wir nehmen hier an, dass 4 Byte für einen integer-Wert verwendet werden.

Aufgabe Drei über Tastatur eingegebene Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden. EVA beachten !!

import java.io.*; public class MainArray5{ public static void main(String argv[]) throws IOException{ int i=0; int zahl; int[] v; String mystr; v = new int[3]; BufferedReader myinput = new BufferedReader (new InputStreamReader(System.in)); // Gleich geht es weiter

// Eingabe der Zahlen while(i<3){ System.out.println("Bitte Zahl eingeben"); mystr = myinput.readLine(); zahl=Integer.parseInt(mystr); v[i]=zahl; i=i+1; } // Ausgabe der Zahlen i=2; while (i>=0){ System.out.print(v[i]+" "); i=i-1;

Aufgabe Verändern Sie das letzte Programm so, daß 10 über Tastatur eingegebene Zahlen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden. EVA beachten !!

hier muß eine Änderung gemacht werden import java.io.*; public class MainArray5{ public static void main(String argv[]) throws IOException{ int i=0; int zahl; int[] v; String mystr; v = new int[3]; BufferedReader myinput = new BufferedReader (new InputStreamReader(System.in)); // Gleich geht es weiter hier muß eine Änderung gemacht werden

System.out.println("Bitte Zahl eingeben"); mystr = myinput.readLine(); // Eingabe der Zahlen while(i<3){ System.out.println("Bitte Zahl eingeben"); mystr = myinput.readLine(); zahl=Integer.parseInt(mystr); v[i]=zahl; i=i+1; } // Ausgabe der Zahlen i=2; while (i>=0){ System.out.print(v[i]+" "); i=i-1; hier muß eine Änderung gemacht werden Welchen Nachteil haben diese vielen Änderungen für den Programmierer ? Der Programmierer kann eine zu tätigende Änderung einfach übersehen. hier muß eine Änderung gemacht werden

Deswegen ist es besser mit sogenannten Konstanten zu arbeiten. (Die Feldlänge muß eine Konstante sein !)

Eine Konstante erzeugt man in Java wie folgt: ... final int len=3;

Eine Konstante erzeugt man in Java wie folgt: ... final int len=3; Falls die Konstante innerhalb einer Methode deklariert wird (oder als formaler Parameter) nennt man dies eine lokale Konstante. Objektkonstanten bzw. Klassenkonstanten --> siehe später.

Eine Konstante erzeugt man in Java wie folgt: ... final int len=3; Während man Objektkonstanten bzw. Klassenkonstanten durchgehend groß schreibt, gibt es zur Schreibweise von lokalen Konstanten keine Empfehlung.

Eine Konstante kann man als eine schreibgeschützte Variable auffassen Eine Konstante kann man als eine schreibgeschützte Variable auffassen. (Deswegen ist sie im eigentlichen Sinne des Worts keine Variable mehr).

Aufgabe: Benutzen Sie beim letzten Programm statt der Feldlänge 10 eine Konstante.

import java.io.*; public class MainArray5{ public static void main(String argv[]) throws IOException{ final int len=10; int i=0; int zahl; int[] v; String mystr; v = new int[len]; BufferedReader myinput = new BufferedReader (new InputStreamReader(System.in)); // Gleich geht es weiter falls die Feldlänge z.B. auf 100 verändert werden soll, muß der Programmierer nur noch die 10 durch die 100 ersetzen (eine einzige Änderung machen).

// Eingabe der Zahlen while(i<len){ System.out.println("Bitte Zahl eingeben"); mystr = myinput.readLine(); zahl=Integer.parseInt(mystr); v[i]=zahl; i=i+1; } // Ausgabe der Zahlen i=len-1; while (i>=0){ System.out.print(v[i]+" "); i=i-1;

Aufgabe: Verändern Sie das Java-Programm so, dass der Anwender die Anzahl der einzugebenden Zahlen festlegen kann.

public class MainArray6{ public static void main(String argv[]) import java.io.*; public class MainArray6{ public static void main(String argv[]) throws IOException{ int len; int i=0; int zahl; int[] v; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Feldlänge eingeben"); mystr = myinput.readLine(); len=Integer.parseInt(mystr); v = new int[len]; In len steht der über Tastatur eingegebene Wert Es wird Speicher für len integer-Werte angelegt (reserviert)

// Genau das Gleiche wie vorher: while(i<len){ System.out.println("Bitte Zahl eingeben"); mystr = myinput.readLine(); zahl=Integer.parseInt(mystr); v[i]=zahl; i=i+1; } i=len-1; while (i>=0){ System.out.print(v[i]+" "); i=i-1;

Wie kann man wieder mit einer Konstanten arbeiten? import java.io.*; public class MainArray6{ public static void main(String argv[]) throws IOException{ int len; int i=0; int zahl; int[] v; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Feldlänge eingeben"); mystr = myinput.readLine(); len=Integer.parseInt(mystr); v = new int[len]; Wie kann man wieder mit einer Konstanten arbeiten?

len wird an dieser Stelle deklariert und initialisiert. import java.io.*; public class MainArray6{ public static void main(String argv[]) throws IOException{ // int len; int i=0; int zahl; int[] v; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Feldlänge eingeben"); mystr = myinput.readLine(); final int len = Integer.parseInt(mystr); v = new int[len]; len wird an dieser Stelle deklariert und initialisiert. Wenn man len schon hier oben als Konstante deklarieren würde, könnte man unten den Wert nicht mehr auf den Wert von Integer.parseInt(mystr) setzen.

Merke Mit dem zu jedem Array automatisch zugehörigem public Attribut length kann man die Länge eines Array bestimmen.

Aufgabe: Lösen Sie die letzte Aufgabe mit Verwendung des Attributs length. Was muss im letzten Programm nur verändert werden?

// Genau das Gleiche wie vorher: import java.io.*; public class MainArray6{ public static void main(String argv[]) throws IOException{ int len; int i=0; int zahl; int[] v; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Feldlänge eingeben"); mystr = myinput.readLine(); len=Integer.parseInt(mystr); v = new int[len];

// Hier ändern sich 2 Zeilen while(i<v.length){ System.out.println("Bitte Zahl eingeben"); mystr = myinput.readLine(); zahl=Integer.parseInt(mystr); v[i]=zahl; i=i+1; } i=v.length-1; while (i>=0){ System.out.print(v[i]+" "); i=i-1;

Aufgabe: Bestimmen Sie das Maximum und das Minimum der in der vorigen Aufgabe eingegebenen Zahlen. EVA beachten !!

// Programm von vorher import java.io.*; public class MainArray6{ public static void main(String argv[]) throws IOException{ int min, max; int len; int i=0; int zahl; int[] v; String mystr; BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Feldlänge eingeben"); mystr = myinput.readLine(); len=Integer.parseInt(mystr); v = new int[len]; Das ist neu (zu vorher)

// Immer noch das Gleiche wie vorher: while(i<len){ System.out.println("Bitte Zahl eingeben"); mystr = myinput.readLine(); zahl=Integer.parseInt(mystr); v[i]=zahl; i=i+1; } // jetzt kommt etwas Neues...

i = 0; max = v[0]; min = v[0]; do{ if(v[i]>max) max = v[i]; if(v[i]<min) min = v[i]; i=i+1; } while(i<len); System.out.println("Maximum ="+max); System.out.println("Minimum ="+min); }

Arrays, deren Komponenten,(Elemente, Zellen) aus Objekten (und nicht aus primitiven Datentypen) bestehen.

Wir benutzen wieder die schon bekannte Klasse Hund. Herr H Wir benutzen wieder die schon bekannte Klasse Hund. Herr H. kauft den Hund "Goldi" mit 10 Kg und den Hund "Dicki" mit 20 Kg Gewicht und speichert diese in seiner Variable hunde ab. Wie muss hunde deklariert werden. Erstellen Sie das zugehörige Programm in Java.

import java.io.*; public class MainArray8{ public static void main(String argv[]) throws IOException{ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi", 10); hunde[1]=new Hund("Dicki", 20); System.out.println(hunde[0].getName()+" "+ hunde[0].getGewicht()); System.out.println(hunde[1].getName()+" "+ hunde[1].getGewicht()); } // Klasse Hund wie früher, kommt gleich...

class Hund{ private String name; private int gewicht; public Hund(String pName, int pGewicht){ name=pName; gewicht=pGewicht; } public void setName(String pName){ name = pName; public String getName(){ return(name); public void setGewicht(int pGewicht){ gewicht = pGewicht; public int getGewicht(){ return(gewicht);

Was veranlasst also der folgende Programmausschnitt im Arbeitsspeicher?

Weil hunde eine lokale Variable ist, ist der Wert undefiniert. Adresse Wert ... ? hat natürlich einen konkreten, uns unbekannten Wert, der mehrere Bytes groß ist (und nicht wie hier angedeutet nur 1 Byte verbraucht). Diese Interna brauchen uns nicht zu interessieren. hunde 0120 ? ... Ein Zeiger ist eine Variable, deren Wert die Anfangsadresse eines Speicherplatzes (z.B. einer Variable oder Objekt) ist. Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für den Zeiger (Referenz, Verweis, Pointer) mit Namen hunde reserviert. public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. Was veranlasst diese Deklaration im Arbeitsspeicher ?

Adresse Wert ... Adresse Wert ... Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. hunde 0120 ? 0470 ... Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das hunde zeigen soll. public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. Aus Platzgründen wird hier und im Folgendender Arbeitsspeicher auf mehrere Tabellen verteilt, obwohl eigentlich der ganze Speicher durch eine Tabelle dargestellt wird! Wie viel Byte Speicher werden reserviert? (Antwort nächste Folie)

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Wie viel Byte Speicher benötigt null jeweils ? hunde 0120 ? 0470 null ... Das Feld besteht aus 2 Objekten (Hunden). Da aber für ein Objekt ein Zeiger (Adresse) verwendet wird und wir hier annehmen, dass ein Zeiger 4 Byte Speicher benötigt, werden 8 Byte Speicher reserviert. Standardmäßig wird ein Zeiger mit null vorbelegt. null public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. Dies steht nicht in der JKS. Wir nehmen hier an: 4 Bytes Welchen Wert muss hunde bekommen, damit es auf das gerade angelegte Objekt zeigt?

Adresse Wert ... Adresse Wert ... 0473 0474 0477 hunde 0120 0470 null ... null public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

Adresse Wert ... Adresse Wert ... 0473 0474 0477 hunde 0120 0470 0470 null ... null public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

Adresse Wert ... Adresse Wert ... 0473 0474 0477 hunde 0120 0470 0470 null ... null Was veranlasst diese Anweisung im Arbeitsspeicher ? public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

Das Objekt (string) "Goldi" wird angelegt und die Adresse davon gespeichert. Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... 0120 0470 0470 null 0600 Adr. Goldi ... Der int-Wert 10 benötigt eine bestimmte Menge Bytes. Wir nehmen an: 4 Byte 10 Was steht dort an dieser Stelle im Arbeitsspeicher? null Welchen Wert muss hunde[0] bekommen, damit es auf das gerade angelegte Objekt zeigt? Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das hunde[0] zeigen soll. public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. hunde[0]

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... 0120 0470 0470 0600 Adr. Goldi ... 10 null public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. hunde[0]

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... 0120 0470 0470 0600 0600 Adr. Goldi ... 10 null public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. hunde[0]

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... 0120 0470 0470 0600 0600 Adr. Goldi ... 10 null Was veranlasst diese Anweisung im Arbeitsspeicher ? public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

Das Objekt (string) "Dicki" wird angelegt und die Adresse davon gespeichert. Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... hunde[1] Was steht dort an dieser Stelle im Arbeitsspeicher? 0120 0470 0470 0600 0600 Adr. Goldi ... Der int-Wert 20 benötigt eine bestimmte Menge Bytes. Wir nehmen an: 4 Byte 10 null Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das hunde[1] zeigen soll. 0700 Adr. Dicki public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. Welchen Wert muss hunde[1] bekommen, damit es auf das gerade angelegte Objekt zeigt? 20

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... hunde[1] 0120 0470 0470 0600 0600 Adr. Goldi ... 10 null 0700 Adr. Dicki public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. Welchen Wert muss hunde[1] bekommen, damit es auf das gerade angelegte Objekt zeigt? 20

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... hunde[1] 0120 0470 0470 0600 0600 Adr. Goldi ... 10 0700 Adr. Dicki public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 20

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... hunde[1] 0120 0470 0470 0600 0600 Adr. Goldi ... 10 0700 0700 Adr. Dicki public static void main(...){ final int len=2; Hund[] hunde; hunde=new Hund[len]; hunde[0]=new Hund("Goldi",10); hunde[1]=new Hund("Dicki",20); } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 20

Die Objekte (die strings) "Goldi" und "Dicki" auch noch im Arbeitsspeicher dargestellt ergibt dann:

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Für die Zeichenkette "Goldi" wurde z.B. hier Speicher reserviert. Adresse Wert ... Welche Werte müssen dann an diesen Stellen stehen? 0120 0470 0470 0600 0600 Adr. Goldi ... 10 ... 0700 0800 Goldi 0700 Adr. Dicki Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 0900 Dicki 20 Für die Zeichenkette "Dicki" wurde z.B. hier Speicher reserviert.

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... 0120 0470 0470 0600 0600 ... 10 ... 0700 0800 Goldi 0700 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 0900 Dicki 20

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... 0120 0470 0470 0600 0600 0800 ... 10 ... 0700 0800 Goldi 0700 0900 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. Welche Variablen bezeichnen die folgenden Speicherbereiche (durch Anfangsadresse gegeben)? 0900 Dicki 20

Adresse Wert ... Adresse Wert ... 0473 0474 0477 Adresse Wert ... 0120 0470 0470 0600 0600 0800 ... 10 ... 0700 0800 Goldi 0700 0900 Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 0900 Dicki 20 hunde[0] hunde[1] hunde

Eine weitere interessante Bemerkung Die Müllabfuhr hilft !! Ein Beispiel ... Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

Herr A. hat im Supermarkt einen Romadur-Käse gekauft und ihn auf die Rückbank gelegt. Durch gewagte Bremsmanöver ist dieser unter den Vordersitz gerutscht. Auf der Heimfahrt hat er eine Tramperin mit genommen. Die interessante Unterhaltung über Mathematik hat ihn so gefesselt und verwirrt, daß er seinen Einkauf vergaß und an der nächsten Tanke nochmals einen Romadur-Käse mitgenommen hat. Durch den in den nächsten Wochen beginnenden Zersetzungsprozeß hätte sich das Auto in ein Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

Biotop verwandelt, wenn es nicht die helfenden Hände seiner Mutter gegeben hätte, die das Auto regelmäßig reinigt. Die Mutter hat also die Funktion einer Müllabfuhr, die vergessene und deswegen nicht mehr ansprechbare Speicherleichen automatisch beseitigt. In Java macht dies der sogenannte Garbage Collector, der die Müllabfuhr für nicht mehr benötigten Speicherplatz ist. Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

Ein Beispiel Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

public static void main( String[] args){ int[] v; v = new int[2]; } Die Anweisungen seien bis zu dieser Anweisung alle ausgeführt. Was wurde dadurch im Arbeitsspeicher veranlaßt? Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt.

Adresse Wert ... v wird mit dem Speicher verlinkt und die Elemente des Feldes mit 10 bzw. 11 belegt. Adresse Wert ... 0470 0471 0472 0473 0474 0475 0476 0477 v 0120 0470 ... 10 public static void main(...){ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v[0]= 100; v[1]= 101; } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 11

Adresse Wert ... Adresse Wert ... 0470 0471 0472 0473 0474 0475 0476 0477 Die Anweisungen seien bis zu dieser Anweisung alle ausgeführt. Was wurde dadurch im Arbeitsspeicher veranlaßt? v 0120 0470 ... 10 public static void main(...){ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v[0]= 100; v[1]= 101; } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 11

Adresse Wert ... Es wird Speicher für die 2 Elemente reserviert und diese mit 0 belegt. Adresse Wert ... 0200 0201 0202 0203 0204 0205 0206 0207 Adresse Wert ... 0470 0471 0472 0473 0474 0475 0476 0477 v 0120 0470 ... 10 public static ...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v[0]= 100; v[1]= 101; } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 11

Adresse Wert ... Dann wird dieser Speicher mit v verlinkt. Adresse Wert ... 0200 0201 0202 0203 0204 0205 0206 0207 Adresse Wert ... 0470 0471 0472 0473 0474 0475 0476 0477 v 0120 0470 ... 10 public static ...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v[0]= 100; v[1]= 101; } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 11

Adresse Wert ... Adresse Wert ... 0200 0201 0202 0203 0204 0205 0206 0207 Adresse Wert ... 0470 0471 0472 0473 0474 0475 0476 0477 v 0120 ... 10 public static ...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v[0]= 100; v[1]= 101; } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 11

Adresse Wert ... Adresse Wert ... 0200 0201 0202 0203 0204 0205 0206 0207 Adresse Wert ... 0470 0471 0472 0473 0474 0475 0476 0477 v 0120 0200 ... 10 public static ...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v[0]= 100; v[1]= 101; } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 11

Adresse Wert ... ... Und die Elemente des Feldes mit 100 bzw. 101 belegt. Adresse Wert ... 0200 0201 0202 0203 0204 0205 0206 0207 Adresse Wert ... 0470 0471 0472 0473 0474 0475 0476 0477 v 0120 0200 ... 100 10 public static ...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v[0]= 100; v[1]= 101; } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 101 11

Adresse Wert ... Adresse Wert ... 0200 0201 0202 0203 0204 0205 0206 0207 Adresse Wert ... 0470 0471 0472 0473 0474 0475 0476 0477 v 0120 0200 ... 100 10 public static ...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v[0]= 100; v[1]= 101; } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 101 11 Wie kann man jetzt noch auf den Speicher mit Adressbeginn 0470 und die Elemente 10 und 11 zugreifen? Mit v[0] oder v[1] ???

Adresse Wert ... Adresse Wert ... 0200 0201 0202 0203 0204 0205 0206 0207 Adresse Wert ... 0470 0471 0472 0473 0474 0475 0476 0477 v 0120 0200 ... 100 10 Nein! Mit v[0] oder v[1] greift man auf den Speicher mit Adressbeginn 0200 zu ! Auf den Speicher mit Adressbeginn 0470 kann nicht mehr zugegriffen werden. Er ist eine Speicherleiche. Er muß nicht vom Programmierer entfernt werden, sondern er wird von der Java-Müllabfuhr (Garbage Collector) entsorgt. Würde er nicht entsorgt werden, könnte immer mehr unbenutzter Speicher dazu führen, dass z.B. kein Platz mehr für Variablen da ist. public static ...{ int[] v; v = new int[2]; v[0]= 10; v[1]= 11; v[0]= 100; v[1]= 101; } Aufgabe: Die Schüler sollen das Teilprogramm abschreiben. Dann wird das Programm gemeinsam besprochen. Frage: Was geschieht programmintern durch die Deklaration int x = 5 ? Antwort: Es wird eine Speicherzelle mit dem Namen x, der Adresse 0123 und dem Wert 5 angelegt. int *ptr ? Es wird eine Speicherzelle mit dem Namen ptr, der Adsresse 0456 und dem Wert einer Adresse, z.B. 0815 angelegt. Was geschieht durch die Anweisung ptr = &x; Der Wert der Variablen ptr (Speicherzelle mit Namen ptr) bekommt die Adresse der Variablen x zugewiesen. *ptr = 13; Der Inhalt der Adresse 0123 wird auf 13 gesetzt. 101 11