Einzelnen Beitrag anzeigen
Alt 01.07.2008, 22:28   #2 (permalink)
Crystallion
Extrem Tweaker
 
Benutzerbild von Crystallion
 

Registriert seit: 14.07.2004
Beiträge: 2.062

Crystallion ist ein LichtblickCrystallion ist ein LichtblickCrystallion ist ein LichtblickCrystallion ist ein LichtblickCrystallion ist ein Lichtblick

Standard AW: [C] So ne Sache mit nem void Pointer

Zitat:
Zitat von MasterMito Beitrag anzeigen
Gefragt ist die Ausgabe von:
1. sizeof(a) = %d; (das sind 4 Byte, das sollte klar sein)
Richtig, das sind 4 Byte. Wenn Dir das klar ist, müsste Dir aber auch 3. klar sein.

Zitat:
Zitat von MasterMito Beitrag anzeigen
2. sizeof(a[0]) = %d (das sind 2 Byte, immer noch alles bestens)
Stimmt auch, ein short int ist 16bit groß.

Zitat:
Zitat von MasterMito Beitrag anzeigen
3. sizeof(cpointer) = %d (da gehts los, wie groß soll der denn sein, 4???)
Die gleiche Logik wie in 1.: cpointer ist vom Typ char*, also ein Pointer. Pointer sind in 32bit-Umgebungen normalerweise genau so groß, also 4 Byte.

Zitat:
Zitat von MasterMito Beitrag anzeigen
4. *cpointer = %d (omg... wat will der Spack)
Das ist knifflig. Was vor dem '=' steht, heißt folgendes: "Interpretiere den Wert an der Speicherstelle cpointer [=vptr=a] als char".

Das heißt, es geht um die ersten acht Bit (weil char) des short int mit dem Wert 1.

Der lautet binär 1000000000000000 (hier kommt Little Endian ins Spiel, das niederwertigste Bit wird als erstes gespeichert), die ersten acht Bits sind also 10000000. So steht es im Speicher des Rechners.

In der gebräuchlichen Darstellung würde man das als Big Endian schreiben, nämlich 00000001. Interpretiert wird es in beiden Fällen einfach als eine 1, in dem Fall also als der Character mit der Nummer 1. Laut Wikipedia ist das ein Steuerzeichen ("SOH").

Als Zeichen hat das keine Darstellung, der %d-Modifikator im printf gibt das aber einfach als "1" aus.

Zitat:
Zitat von MasterMito Beitrag anzeigen
5. *(cpointer+1) = %d (der abschluss)
Hier wird cpointer zuerst um 1 inkrementiert. Da es ein char-Pointer ist, wird der Zeiger dadurch um acht Bit weitergeschoben - also auf die hinteren acht Bits des short ints '1' im Speicher, die da lauten 00000000.

Dann wird der verschobene Pointer dereferenziert und als char mit der Nummer 0 interpretiert. Das Zeichen hat keine Darstellung als ASCII-Zeichen, aber printf mit %d gibt es als 0 aus.


Hoffe das hilft Dir weiter. Wenn was unklar ist versuch ich's gern noch besser zu erklären.
Crystallion ist offline   Mit Zitat antworten
2 Benutzer bedanken sich für den Beitrag:
Exit (02.07.2008), MasterMito (02.07.2008)