30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

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.

132 6. Po<strong>in</strong>ter und References<br />

richtige Element erwischen und nicht e<strong>in</strong>fach irgende<strong>in</strong> Byte. Selbiges gilt<br />

für die Po<strong>in</strong>terarithmetik, bei der auch elementweise und nicht byteweise<br />

gerechnet wird.<br />

Adressen s<strong>in</strong>d immer gleich, denn dem Computer ist es vollkommen egal,<br />

ob e<strong>in</strong>e Adresse nun auf e<strong>in</strong>en <strong>in</strong>t32, double oder sonst etwas zeigt. Die Interpretation<br />

bleibt dem Programm überlassen. Was sagt uns das? Nun, ganz<br />

e<strong>in</strong>fach: Mittels Typecasts können wir sehr e<strong>in</strong>fach e<strong>in</strong>e Neu<strong>in</strong>terpretation<br />

des dah<strong>in</strong>terstehenden Werts erreichen. Allerd<strong>in</strong>gs hat der Compiler def<strong>in</strong>itiv<br />

etwas dagegen, dass man e<strong>in</strong>fach wild Po<strong>in</strong>ter e<strong>in</strong>es Typs Po<strong>in</strong>tern e<strong>in</strong>es<br />

anderen Typs zuweist, weil er ja die Gefahr der Fehl<strong>in</strong>terpretation kennt. Das<br />

Statement<br />

u<strong>in</strong>t8 *my_ptr = your_ptr;<br />

wird vom Compiler nur dann übersetzt, wenn auch your_ptr e<strong>in</strong> u<strong>in</strong>t8 * ist.<br />

Ist er das nicht, sondern z.B. e<strong>in</strong> <strong>in</strong>t32 *, dann quittiert das der Compiler<br />

mit e<strong>in</strong>er netten Meldung, dass man doch aufpassen soll, was man tut. Es<br />

wird von e<strong>in</strong>em C ++ Compiler z.B. nicht e<strong>in</strong>mal e<strong>in</strong> impliziter Cast zwischen<br />

e<strong>in</strong>em char*, unsigned char* und e<strong>in</strong>em signed char* durchgeführt, da ja<br />

nicht def<strong>in</strong>iert ist, ob nun e<strong>in</strong> char signed oder unsigned ist.<br />

Wie allerd<strong>in</strong>gs schon bekannt ist, gibt es Mittel und Wege, den Compiler<br />

zu überreden, gewisse D<strong>in</strong>ge zu akzeptieren, nämlich entsprechende Casts.<br />

Im Pr<strong>in</strong>zip kann man damit fast beliebigste Neu<strong>in</strong>terpretationen erzw<strong>in</strong>gen,<br />

nur muss man wirklich ganz genau wissen, was man macht! Sehen wir uns<br />

e<strong>in</strong>fach e<strong>in</strong>mal e<strong>in</strong> Standardbeispiel an, das zeigt, wie man zu den e<strong>in</strong>zelnen<br />

Bytes e<strong>in</strong>es “größeren” Ganzzahlenwertes, also z.B. e<strong>in</strong>es <strong>in</strong>t32 kommt<br />

(bytes_of_<strong>in</strong>t32_demo.cpp):<br />

1 // bytes of <strong>in</strong>t32 demo . cpp − e x t r a c t the s i n g l e bytes o f an <strong>in</strong>t32<br />

2<br />

3 #<strong>in</strong>clude <br />

4 #<strong>in</strong>clude ” u s e r t y p e s . h”<br />

5<br />

6 us<strong>in</strong>g std : : cout ;<br />

7 us<strong>in</strong>g std : : endl ;<br />

8<br />

9 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

10 <strong>in</strong>t ma<strong>in</strong> ( <strong>in</strong>t argc , char ∗ argv [ ] )<br />

11 {<br />

12 <strong>in</strong>t32 num for extraction = 4;<br />

13 u<strong>in</strong>t8 ∗ i n t 3 2 i t e r a t o r =<br />

14 re<strong>in</strong>terpret cast(&num for extraction ) ;<br />

15 for ( u<strong>in</strong>t32 count = 0; count < 4; count++)<br />

16 cout

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!