Adressverschiebung
In C kannst du unter bestimmten Voraussetzungen Adressen verschieben. Wie das genau funktioniert erklären wir dir in diesem Beitrag!
Inhaltsübersicht
Voraussetzungen für eine Adressverschiebung
Als Erstes solltest du wissen, unter welchen Voraussetzungen du Adressen überhaupt verschieben kannst. In Fachsprache ausgedrückt ist eine Verschiebung möglich, wenn ein adresswertiger Ausdruck vom Typ t* vorliegt und dieser einen Wert x besitzt. Außerdem muss er noch eine endliche Länge von n Element N aufweisen.
Adressverschiebung – Beispiel
Da mit dieser abstrakten Beschreibung allerdings keinem geholfen ist, schauen wir uns das Ganze an einem Beispiel an:
Wir deklarieren einen Zeiger p vom Typ char und weisen ihm den Wert “Beispiel“ zu.
Damit ist der Typ des Pointers char. Wir haben also einen gültigen Typ t*. Mit ‘Beispiel‘ haben wir außerdem einen gültigen Wert x, der uns auch mit einer endlichen Länge von neun versorgt. Warum neun? Das liegt daran, dass eine Zeichenkette immer mit einer binären Null beendet wird.
Dein Zeiger liegt nun also so im Speicher:
Änderung der Adresse von p
Wenn du jetzt die Adresse von p auf die Speicherzelle, die ‘s‘ enthält, ändern möchtest, geschieht das nach dem adresswertigen Ausdruck (n * sizeof(t)) + a. Beginnen wir diesmal von hinten. Das a steht für unsere derzeitige Speicheradresse, die im Moment die ist, die B enthält. Wir können aber nicht einfach die Speicherzellen hochzählen. Das liegt daran, dass verschiedene Variablentypen unterschiedlich große Speicherbereiche benötigen.
Wir machen jetzt aber erst einmal hier weiter. Zu unserem Glück braucht nämlich eine Variable vom Typ char nur eine Speicherzelle, also 8 Bit Speicher. Wenn wir das auf unsere allgemeine Formel übertragen, heißt das, dass sizeof(t) eins ist. Nun müssen wir noch für n die Anzahl der Werte, um die wir unsere Adresse verschieben wollen, einsetzen.
Super! Damit weißt du jetzt schonmal theoretisch, wie diese Verschieberei funktioniert! Allerdings musst du auch hier – wie bei den meisten anderen Befehlen auch – vorsichtig sein. Verschiebst du nämlich eine Adresse zu weit und biegst damit deinen Zeiger in einen nicht reservierten Speicherbereich, kann es durch deine Schreib- und Leseoperationen zu Fehlern kommen.
Änderung der Adresse von Zeigern und Arrays
Die Notation für diesen Befehl ist für Zeiger und für Arrays etwas unterschiedlich. Wollen wir die Adresse eines Zeigers ändern, entspricht die neue Adresse p + n p[n] oder auch *(p+n). Damit können wir die Adresse eines Zeigers ganz unkompliziert verschieben. Bei Feldern müssen wir uns allerdings einige extra Dinge merken. Hier entspricht array + n nämlich &array[n]. Array[n] würde uns in diesem Fall zum Wert der Speicherzelle und nicht zu deren Adresse führen. Die zweite Möglichkeit, Adressen von Feldern zu verschieben, ist wieder mit der der Zeiger identisch. *(array +n) entspricht nämlich genauso array[n].
Daraus können wir jetzt folgern, dass char a[] und char * a sich nicht nur gleich anhören, sondern, was die Übergabe als Eingabeparameter angeht, nahezu identisch sind. Bei beiden wird immer eine Adresse übergeben und in der betreffenden Funktion mit einem Zeiger gerechnet.
Als Letztes noch ein Tipp: Du kannst mit dem Kaufmannsund auch die Adresse eines Arrays ausgeben. Ist das nicht praktisch?
Jetzt bist du bestens über die Adressverschiebung informiert und kannst gleich selbst loslegen ein paar zu verschieben!