30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

6.2 Po<strong>in</strong>ter 123<br />

Zeilen 34–35: Hier sieht man, dass man mit e<strong>in</strong>em dynamischen Array, das<br />

durch e<strong>in</strong>en Po<strong>in</strong>ter repräsentiert wird, gleich umgehen kann, wie es schon<br />

von e<strong>in</strong>em statischen Array bekannt ist: Man kann zum Zugriff auf e<strong>in</strong><br />

bestimmtes Element e<strong>in</strong>fach den Index dieses Elements <strong>in</strong> eckigen Klammern<br />

dem Po<strong>in</strong>ter nachstellen.<br />

Nicht nur, dass sich e<strong>in</strong> Po<strong>in</strong>ter und e<strong>in</strong>e (statische) Array-Variable <strong>in</strong><br />

dieser Beziehung gleich verhalten, sie werden <strong>in</strong>tern tatsächlich beide<br />

durch e<strong>in</strong>en Po<strong>in</strong>ter realisiert! Man kann also e<strong>in</strong>e (statische) Array-<br />

Variable auch e<strong>in</strong>fach e<strong>in</strong>em Po<strong>in</strong>ter zuweisen, sofern dieser den korrekten<br />

Typ hat. Durch diese Zuweisung zeigt dann der Po<strong>in</strong>ter direkt auf das<br />

statische Array. Sehr oft sieht man vor allem bei Parameterlisten, dass<br />

die beiden Arten von Arrays vom Typ her beliebig austauschbar s<strong>in</strong>d.<br />

Vorsicht Falle: Auch wenn sich statische und dynamische Arrays gleich<br />

verhalten und <strong>in</strong>tern gleich repräsentiert werden, gibt es e<strong>in</strong>en riesigen<br />

Unterschied, wie (und auch wo) der Speicher für sie bereitgestellt wird.<br />

Es darf dementsprechend niemals versucht werden, den Speicher, der für<br />

e<strong>in</strong> statisches Array allokiert ist, mittels delete freizugeben, denn dies<br />

führt geradewegs <strong>in</strong>s Verderben.<br />

Vorsicht Falle: Es gibt ke<strong>in</strong>e Möglichkeit, zur Laufzeit herauszuf<strong>in</strong>den,<br />

für wie viele Elemente nun Speicher angefordert wurde! Daher muss man<br />

selbst Sorge dafür tragen, dass man nicht über die Grenzen e<strong>in</strong>es Arrays<br />

h<strong>in</strong>ausschreibt.<br />

Zeilen 39–41: Auch die Po<strong>in</strong>ter-Arithmetik funktioniert <strong>in</strong> C ++ ganz gleich<br />

wie <strong>in</strong> C: Wenn man zu e<strong>in</strong>em Po<strong>in</strong>ter e<strong>in</strong>e Zahl addiert, dann bewirkt<br />

man, dass der Po<strong>in</strong>ter um genau so viele Elemente (nicht Bytes!!!) im<br />

Array vorrückt, wie die Zahl besagt. Subtrahiert man e<strong>in</strong>e Zahl, dann<br />

geht das Spielchen natürlich <strong>in</strong> die Gegenrichtung. In Zeile 41 machen<br />

wir uns dies zunutze, <strong>in</strong>dem e<strong>in</strong>fach der Wert 5 zum iteration_ptr<br />

addiert wird, woraufh<strong>in</strong> der Po<strong>in</strong>ter auf das sechste Element (also das<br />

mit Index 5) zeigt. Dereferenziert man diese Adresse, so kommt man<br />

zum dah<strong>in</strong>terstehenden Wert.<br />

Vorsicht Falle: Oft wird von Neul<strong>in</strong>gen der Fehler gemacht, e<strong>in</strong>e Anweisung<br />

wie *(iteration_ptr + 5) nicht zu klammern, also stattdessen<br />

*iteration_ptr + 5 h<strong>in</strong>zuschreiben. Diese zwei Statements haben allerd<strong>in</strong>gs<br />

e<strong>in</strong>e grundverschiedene Bedeutung:<br />

*(iteration_ptr + 5) bedeutet, dass zuerst der Po<strong>in</strong>ter um 5 Elemente<br />

versetzt wird und danach der dort gespeicherte Wert dereferenziert wird.<br />

*iteration_ptr + 5 bedeutet im Gegensatz dazu, dass zuerst der Po<strong>in</strong>ter<br />

dereferenziert wird und danach zu diesem Wert 5 addiert wird.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!