Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

ARRAY oder FELD oder VEKTOR

Ähnliche Präsentationen


Präsentation zum Thema: "ARRAY oder FELD oder VEKTOR"—  Präsentation transkript:

1 ARRAY oder FELD oder VEKTOR

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

3 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));

4 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+" "); } }

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

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

7 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).

8 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

9 Java-Syntax

10 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

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

12 ... v = new int[3];

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

14 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];

15 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.

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

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

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

19 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:

20 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;

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

22 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.

23 Deklaration und Speicher anlegen in einer Anweisung

24 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 ...

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

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

27 Deklaration, Speicher anlegen und initialisieren in einer Anweisung

28 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

29 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

30 Was veranlasst also der folgende Programmausschnitt im Arbeitsspeicher?

31 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 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 ?

32 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 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!

33 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 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?

34 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 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]; }

35 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 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]; }

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

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

38 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.

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

40 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

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

42 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 !!

43 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

44 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

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

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

47 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.

48 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.

49 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).

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

51 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).

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

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

54 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)

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

56 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?

57 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.

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

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

60 // 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];

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

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

63 // 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)

64 // 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...

65 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); }

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

67 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.

68 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...

69 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);

70 Was veranlasst also der folgende Programmausschnitt im Arbeitsspeicher?

71 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 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 ?

72 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 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)

73 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 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?

74 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 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.

75 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 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.

76 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 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.

77 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 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]

78 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 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]

79 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 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]

80 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 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.

81 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 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

82 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 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

83 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 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

84 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 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

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

86 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 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.

87 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 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

88 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 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

89 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 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

90 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 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.

91 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 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.

92 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 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.

93 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 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.

94 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 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.

95 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 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

96 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 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

97 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 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

98 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 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

99 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 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

100 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 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

101 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 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

102 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 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] ???

103 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 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


Herunterladen ppt "ARRAY oder FELD oder VEKTOR"

Ähnliche Präsentationen


Google-Anzeigen