Was ist ein Zeiger? - Informatik in der Oberstufe
Was ist ein Zeiger? - Informatik in der Oberstufe
Was ist ein Zeiger? - Informatik in der Oberstufe
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