Adressen und Zahlen in C
Wandlungen einer Adresse in eine Zahl
Eine Adresse kann grundsätzlich in eine Zahl gewandelt werden. Das Ergebnis der Wandlung ist implementationsdefiniert. Falls der Zieltyp das Ergebnis nicht darstellen kann, hat die Wandlung jedoch undefiniertes Verhalten. Es ist nicht gesagt, daß es für jeden Adreßtyp überhaupt irgendeinen Zahlentyp gibt, der seine Werte darstellen kann.
- N2310, 6.3.2.3p6
- Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type, the behavior is undefined. The result need not be in the range of values of any integer type.
Damit verbietet sich solch eine Wandlung in portablem Code.
»uintptr_t« und »intptr_t«
Es ist jedoch erlaubt, eine void-Adresse in einen Wert des vorzeichenlosen Zahlentyps »uintptr_t« oder des vorzeichenbehafteten Zahlentyps »intptr_t« zu wandeln. Die Rückwandlung der erhaltenen Zahlen in eine void-Adresse ergibt dann wieder die ursprünglich Adresse.
Die beide Typen »uintptr_t« und »intptr_t« müssen jedoch nicht von jeder C -Implementation implementiert werden. Damit kann man sich in portablem Code auch nicht darauf verlassen, daß sie verfügbar sind.
- Siehe auch
- N2310, 7.20.1.4p1
Wandlungen einer Zahl in eine Adresse
Eine Zahl kann grundsätzlich in eine Adresse gewandelt werden. Das Ergebnis ist (außer bei der Nulladreßkonstanten »0«) jedoch implementationsdefiniert. Es kann sein, daß die erhaltene Adresse nicht verwendbar ist.
- N2310, 6.3.2.3p5
- An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.
Damit verbietet sich solch eine Wandlung in portablem Code.
»uintptr_t« und »intptr_t«
Selbst die Typen »uintptr_t« und »intptr_t« erlauben es im allgemeinen nicht, eine beliebige Zahl in eine Adresse zu verwandeln, der dann verwendet werden darf.
Anwendbarkeit von Wandlungen zwischen Zahlen und Adressen
Wandlungen zwischen Adressen und Zahlen sind bei einzelnen C -Implementationen möglich.
Bei speziellen C -Implementationen für Microcontroller kann man beispielsweise durch Auswertung des folgenden Ausdrucks den Wert «7» in den Speicher bei der Adresse «4096» schreiben.
- Ausdruck
*( int * )4096 = 7
- Literaturhinweis
- Programming Microcontrollers in C – Ted Van Sickle (2001), Kapitel 3 „Pointers “, Abschnitt „Pointers and Multidimensional Arrays “ (in der zweiten Auflage von 2001)
In maximal portablem Code sind solche Wandlungen aber nicht möglich.