06.06.2015 Aufrufe

Was ist ein Zeiger? - Informatik in der Oberstufe

Was ist ein Zeiger? - Informatik in der Oberstufe

Was ist ein Zeiger? - Informatik in der Oberstufe

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Informatik</strong> 12 mit Java:<br />

Arrays und <strong>Zeiger</strong><br />

¡ ¢ £ ¤ ¥ £ ¦ §<br />

Beispielprogramm:<br />

class ArrayBsp2<br />

{ static <strong>in</strong>t[] a;<br />

static <strong>in</strong>t[] b;<br />

static <strong>in</strong>t zahl = 15;<br />

static void feldAusgabe(<strong>in</strong>t[] feld)<br />

{ for (<strong>in</strong>t i=0; i NullPo<strong>in</strong>terException<br />

a = new <strong>in</strong>t[3]; // a[0] = 0; a[1] = 0; a[2] = 0; automatisch<br />

Out.pr<strong>in</strong>t ("Feld a: "); feldAusgabe(a);<br />

b = a; // k<strong>e<strong>in</strong></strong> Fehler<br />

Out.pr<strong>in</strong>t ("Feld b: "); feldAusgabe(b);<br />

a[0] = 17;<br />

Out.pr<strong>in</strong>t ("Feld a: "); feldAusgabe(a);<br />

Out.pr<strong>in</strong>t ("Feld b: "); feldAusgabe(b);<br />

Out.pr<strong>in</strong>tln("Feldveraen<strong>der</strong>ung <strong>in</strong> Methode");<br />

feldAen<strong>der</strong>ung(a);<br />

Out.pr<strong>in</strong>t ("Feld a: "); feldAusgabe(a);<br />

Out.pr<strong>in</strong>t ("Feld b: "); feldAusgabe(b);<br />

b = null;<br />

// Out.pr<strong>in</strong>tln("b[0] = " + b[0]); --> NullPo<strong>in</strong>terException<br />

Out.pr<strong>in</strong>tln("Zahl = " + zahl);<br />

zahlAen<strong>der</strong>ung(zahl);<br />

Out.pr<strong>in</strong>tln("Zahlveraen<strong>der</strong>ung <strong>in</strong> Methode");<br />

Out.pr<strong>in</strong>tln("Zahl = " + zahl);<br />

} // ma<strong>in</strong><br />

} // class ArrayBsp2<br />

1


Ausgabe:<br />

Feld a: 0 0 0<br />

Feld b: 0 0 0<br />

Feld a: 17 0 0<br />

Feld b: 17 0 0<br />

Feldveraen<strong>der</strong>ung <strong>in</strong> Methode<br />

Feld a: 17 0 21<br />

Feld b: 17 0 21<br />

Zahl = 15<br />

Zahlveraen<strong>der</strong>ung <strong>in</strong> Methode<br />

Zahl = 15<br />

Erklärung:<br />

1. Durch<br />

<strong>in</strong>t[] a;<br />

<strong>in</strong>t[] b;<br />

werden die Arrayvariablen a und b deklariert. Das Array gibt es noch nicht. Es wird schon<br />

Speicherplatz reserviert, aber nicht für das Array, son<strong>der</strong>n nur für a bzw. b zur Aufnahme<br />

<strong>der</strong> Speicheradresse für das noch anzulegende Feld. Der Inhalt <strong>ist</strong> jeweils null, d.h. es <strong>ist</strong><br />

noch k<strong>e<strong>in</strong></strong>e Adresse enthalten. Dementsprechend bekommt man mit<br />

Out.pr<strong>in</strong>tln ("b[0] = " + b[0]);<br />

beim Programmlauf <strong>e<strong>in</strong></strong>e NullPo<strong>in</strong>terException, d.h. man versucht mit Variablen, die <strong>e<strong>in</strong></strong>e<br />

Speicheradresse enthalten muss, zu arbeiten, obwohl sie k<strong>e<strong>in</strong></strong>e Speicheradresse enthält.<br />

2. Mit<br />

a = new <strong>in</strong>t[3];<br />

wird Speicherplatz für das Feld angelegt, alle Elemente von a werden automatisch auf 0<br />

gesetzt und a enthält nun die Speicheradresse des neu angelegten Feldes. Die Variable a <strong>ist</strong><br />

zu <strong>e<strong>in</strong></strong>em <strong>Zeiger</strong> o<strong>der</strong> Po<strong>in</strong>ter geworden.<br />

E<strong>in</strong>en ähnlichen Effekt erhält man, wenn man auf dem Desktop von WINDOWS zwei Verknüpfungen<br />

auf <strong>e<strong>in</strong></strong> Programm erzeugt. Wenn man nun das Programm verän<strong>der</strong>t (z.B. updatet),<br />

zeigen beide Verknüpfungen auf das gleiche verän<strong>der</strong>te Programm.<br />

3. Die Zuweisung<br />

b = a;<br />

führt zu k<strong>e<strong>in</strong></strong>em Fehler. Die Arrayvariable b erhält dadurch die gleiche Speicheradresse wie<br />

die Variable a. Beide Variable zeigen also nun auf das gleiche Feld.<br />

2


4. Mit<br />

a[0] = 17;<br />

wird das Array an <strong>der</strong> nullten Position mit <strong>e<strong>in</strong></strong>em Wert beschrieben. Da aber b auf das<br />

gleiche Feld (gleiche Speicheradresse) zeigt, wird dadurch auch <strong>der</strong> Inhalt des Arrays zu b<br />

verän<strong>der</strong>t.<br />

5. Mit<br />

feldAen<strong>der</strong>ung(a);<br />

wird <strong>der</strong> <strong>Zeiger</strong> a als Parameter <strong>der</strong> Methode feldAen<strong>der</strong>ung(<strong>in</strong>t[] feld) übergeben.<br />

Dementsprechend zeigt nun die lokale Arrayvariable feld auf das gleiche Feld.<br />

Also wirkt sich <strong>e<strong>in</strong></strong>e Än<strong>der</strong>ung <strong>e<strong>in</strong></strong>es Feldelementes auch auf das übergebene Feld aus.<br />

6. Mit<br />

b = null;<br />

Out.pr<strong>in</strong>tln("b[0] = " + b[0]); --> NullPo<strong>in</strong>terException<br />

wird <strong>der</strong> <strong>Zeiger</strong> b auf null gesetzt, d.h. b zeigt nirgendwo h<strong>in</strong>. Dann führt die folgende<br />

Anweisung zum angegebenen Fehler beim Programmlauf.<br />

7. Mit<br />

zahlAen<strong>der</strong>ung(zahl);<br />

wird <strong>der</strong> tatsächliche Wert (Speicher<strong>in</strong>halt) von zahl als Parameter <strong>der</strong> Methode<br />

zahlAen<strong>der</strong>ung(<strong>in</strong>t wert) übergeben bzw. dorth<strong>in</strong> kopiert. Dementsprechend<br />

enthält nun die lokale Variable wert den gleichen Inhalt wie die globale Variable zahl.<br />

E<strong>in</strong>e Än<strong>der</strong>ung <strong>der</strong> lokalen Variable wirkt sich nun nicht auf die globale Variable zahl aus.<br />

8. Will man die Elemente <strong>e<strong>in</strong></strong>es Arrays <strong>e<strong>in</strong></strong>em an<strong>der</strong>en zuweisen, so muss man es mit <strong>e<strong>in</strong></strong>er<br />

Schleife elementeweise tun.<br />

9. Hat <strong>e<strong>in</strong></strong> Array k<strong>e<strong>in</strong></strong>en <strong>Zeiger</strong> mehr, <strong>der</strong> darauf we<strong>ist</strong>, so hängt es ”<br />

<strong>in</strong> <strong>der</strong> Luft“. Dies bemerkt<br />

aber das Java-System und führt dann <strong>e<strong>in</strong></strong>e automatische Speicherber<strong>e<strong>in</strong></strong>igung o<strong>der</strong> Garbage<br />

Collection durch.<br />

10. In Java s<strong>in</strong>d nur die <strong>e<strong>in</strong></strong>fachen Variablentypen wie <strong>in</strong>t, double, boolean, usw. k<strong>e<strong>in</strong></strong>e<br />

<strong>Zeiger</strong>typen. Objekte (<strong>e<strong>in</strong></strong> Array <strong>ist</strong> <strong>e<strong>in</strong></strong> Objekt) s<strong>in</strong>d immer <strong>Zeiger</strong>typen.<br />

Im Vergleich zu an<strong>der</strong>en Programmiersprachen wie z.B. Pascal, Modula und C kann man<br />

aber nicht mit <strong>Zeiger</strong>n rechnen. Die <strong>Zeiger</strong>arithmetik <strong>ist</strong> verboten, was die Sicherheit <strong>der</strong><br />

Programme deutlich erhöht.<br />

3

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!