Zeigerimplementierungsdetails in C
ich würde gerne wissenArchitekturen, die die Annahmen verletzen Ich habe unten aufgeführt. Außerdem würde ich gerne wissen, ob eine der Annahmen für alle Architekturen falsch ist (das heißt, wenn eine davon einfach völlig falsch ist).
sizeof (int *) == sizeof (char *) == sizeof (void *) == sizeof (func_ptr *)
Die speicherinterne Darstellung aller Zeiger für eine bestimmte Architektur ist unabhängig vom Datentyp, auf den verwiesen wird, identisch.
Die speicherinterne Darstellung eines Zeigers entspricht einer ganzen Zahl mit derselben Bitlänge wie die Architektur.
Das Multiplizieren und Teilen von Zeigerdatentypen ist nur vom Compiler verboten. HINWEIS: Ja, ich weiß, dass dies unsinnig ist. Was ich meine ist - gibt es Hardware-Unterstützung, um diese falsche Verwendung zu verbieten?
Alle Zeigerwerte können in eine einzelne Ganzzahl umgewandelt werden. Mit anderen Worten, welche Architekturen verwenden noch Segmente und Offsets?
Das Inkrementieren eines Zeigers entspricht dem Hinzufügensizeof(the pointed data type)
auf die vom Zeiger gespeicherte Speicheradresse. Obp
ist einint32*
dannp+1
ist gleich der Speicheradresse 4 Bytes danachp
.
Ich bin am meisten daran gewöhnt, dass Zeiger in einem zusammenhängenden virtuellen Speicherbereich verwendet werden. Für diesen Zweck kann ich sie im Allgemeinen als Adressen in einer Zahlenreihe betrachten. Siehe StapelüberlauffrageZeigervergleich.