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.util.Scanner; public class MainArray1{ public static void main(String[] args){ int z1; int z2; int z3; Scanner tastatur = new Scanner(System.in);

4 System. out. println("1. Zahl eingeben"); zl = tastatur
System.out.println("1. Zahl eingeben"); zl = tastatur.nextInt(); System.out.println("2. Zahl eingeben"); z2 = tastatur.nextInt(); System.out.println("3. Zahl eingeben"); z3 = tastatur.nextInt(); 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 Diese Variable ist mit einem Hotel (oder einer JVA) vergleichbar
Diese Variable ist mit einem Hotel (oder einer JVA) vergleichbar. In diesen Gebäuden werden die einzelnen Zimmer bzw. Zellen ab 0 beginnend durch nummeriert.

9 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

10 Java-Syntax

11 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

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

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

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

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

16 public class MainArray3{ public static void main(String args[]) {
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.

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

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

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

20 Welchen Wert haben x, y und die Elemente von v an dieser Stelle ?
public class MainArray3{ public static void main(String args[]){ 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:

21 ...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;

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

23 import java.util.Scanner;
public class MainArray4{ public static void main(String args[]){ int len; int[] v; Scanner tastatur = new Scanner(System.in); System.out.println("Bitte Länge eingeben"); len = tastatur.nextInt(); 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.

24 Deklaration und Speicher anlegen in einer Anweisung

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

26 public class MainArray4{
public static void main(String args[]){ }

27 public class MainArray4{
public static void main(String args[]){ int[] v = new int[7]; char[] feldChar = new char[3]; } ... eine Anweisung ... eine andere Anweisung

28 Deklaration, Speicher anlegen und initialisieren in einer Anweisung

29 public class MainArray4{
public static void main(String args[]){ int[] v = {10, 20, 30}; char feld[] = {'M','E','S','K'};   String[] data1 = {"rund", "eckig"};   String[] data2;   data2 = new String[] {"rot", "blau", "gelb"}; } Da hier 3 Elemente angegeben werden, hat das Feld v die Länge 3 Da hier 4 Elemente angegeben werden, hat das Feld feld die Länge 4

30 public class MainArray4{
public static void main(String args[]){ 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

31 Was veranlasst also der folgende Programmausschnitt im Arbeitsspeicher?

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

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

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

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

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

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

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

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

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

41 import java.util.Scanner;
public class MainArray5{ public static void main(String args[]){ int i=0; int zahl; int[] v; Scanner tastatur = new Scanner(System.in); v = new int[3]; // Gleich geht es weiter

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

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

44 hier muß eine Änderung (10 statt 3) gemacht werden
import java.util.Scanner; public class MainArray5{ public static void main(String args[]){ int i=0; int zahl; int[] v; Scanner tastatur = new Scanner(System.in); v = new int[3]; // Gleich geht es weiter hier muß eine Änderung (10 statt 3) gemacht werden

45 System.out.println("Bitte Zahl eingeben"); zahl=tastatur.nextInt();
// Eingabe der Zahlen while(i<3){ System.out.println("Bitte Zahl eingeben"); zahl=tastatur.nextInt(); 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 (10 statt 3) 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 (9 statt 2) gemacht werden

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

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

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

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

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

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

52 import java.util.Scanner;
public class MainArray5{ public static void main(String argv[]){ final int len=10; int i=0; int zahl; int[] v; Scanner tastatur = new Scanner(System.in); v = new int[len]; // 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).

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

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

55 import java.util.Scanner; public class MainArray6{
public static void main(String argv[]){ int len; int i=0; int zahl; int[] v; Scanner tastatur = new Scanner(System.in); System.out.println("Feldlänge eingeben"); len=tastatur.nextInt(); v = new int[len]; In len steht der über Tastatur eingegebene Wert Es wird Speicher für len integer-Werte angelegt (reserviert)

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

57 Wie kann man wieder mit einer Konstanten arbeiten?
import java.util.Scanner; public class MainArray6{ public static void main(String argv[]){ int len; int i=0; int zahl; int[] v; Scanner tastatur = new Scanner(System.in); System.out.println("Feldlänge eingeben"); len=tastatur.nextInt(); v = new int[len]; Wie kann man wieder mit einer Konstanten arbeiten?

58 len wird an dieser Stelle deklariert und initialisiert.
import java.util.Scanner; public class MainArray6{ public static void main(String argv[]){ // int len; int i=0; int zahl; int[] v; Scanner tastatur = new Scanner(System.in); System.out.println("Feldlänge eingeben"); final int len = tastatur.nextInt(); 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 tastatur.nextInt() setzen.

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

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

61 // Genau das Gleiche wie vorher:
import java.util.Scanner; public class MainArray6{ public static void main(String argv[]){ int len; int i=0; int zahl; int[] v; Scanner tastatur = new Scanner(System.in); System.out.println("Feldlänge eingeben"); len=tastatur.nextInt(); v = new int[len];

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

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

64 // Programm von vorher import java.util.Scanner; public class MainArray6{ public static void main(String argv[]){ int min, max; int len; int i=0; int zahl; int[] v; Scanner tastatur = new Scanner(System.in); System.out.println("Feldlänge eingeben"); len=tastatur.nextInt(); v = new int[len]; Das ist neu (zu vorher)

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

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

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

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

69 public class MainArray8{
public static void main(String args[]){ 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...

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

71 Was veranlasst also der folgende Programmausschnitt im Arbeitsspeicher?

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

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

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

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

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

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

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

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

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

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

82 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

83 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

84 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

85 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

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

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

88 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

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. Welche Variablen bezeichnen die folgenden Speicherbereiche (durch Anfangsadresse gegeben)? 0900 Dicki 20

90 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

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

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

93 Biotop verwandelt, wenn es nicht die helfenden Hände seiner strengen, autoritären Eltern gegeben hätte, die das Auto regelmäßig reinigen. 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.

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

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

96 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

97 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

98 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

99 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

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

102 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

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

104 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

105 Zum Schluß noch eine Besonderheit:

106 Die foreach-Schleife

107 Um die Elemente eines Feldes ansprechen zu können (aber nur in aufsteigender Reihenfolge), gibt es die sogenannte (kurzer Quellcode) foreach-Schleife. Sie duchläuft ohne die Angabe einer Laufvariablen das ganze Feld (von der Position 0 bis Feldende). Beispiel nächste Folie.

108 public class Startklasse{ public static void main(String[] args){ int v[]={13,11,19,7}; String daten[]={"rot", "gelb", "blau"}; for(int zahl : v){ System.out.println(zahl); } for(String farbe : daten){ System.out.println(farbe); } } } Eine Variable (hier zahl) vom Typ eines Elements des Feldes wird definiert und … … durch einen Doppelpunkt : vom Namen (hier v) des zu durchlaufenden Feldes getrennt. Analoges wird für das Feld daten gemacht.

109 WICHTIG: Die Reihenfolge der Elemente des Feldes, die durch die foreach-Schleife angesprochen werden, kann nicht verändert werden. Es ist immer die aufsteigende Reihenfolge.


Herunterladen ppt "ARRAY oder FELD oder VEKTOR"

Ähnliche Präsentationen


Google-Anzeigen