Variable per Zeiger erhöhen



  • Wie erhöhe ich den Wert einer Variablen, wenn ich dies über eine Zeigervariable tun will? Mein Code funktioniert nicht, nach der Erhöhung bleibt der Wert unverändert:

    #include <stdio.h>
    
    int main() 
    {
        int i = 12;
        int* p = &i;
        printf("%d\n", i);
        p = p + 1;
        printf("%d\n", i);
    }
    

  • Mod

    Du hast den Zeiger selbst um 1 erhöht. Wie man an den Wert hinter einem Zeiger kommt, erfährst du so ungefähr auf der ersten Seite des Kapitels über Zeiger in einem Lehrbuch.



  • Habe es jetzt herausgefunden:

    *p = *p + 1;

    Warum funktioniert aber folgende Zeile nicht?

    *p++;

    Obwohl ich hier dereferenziert habe, erhöht er die Variable nicht, sondern läßt den Wert auf 12.

    Außerdem: Als ich den Zeiger, also somit die Adresse von p mit p = p + 1 geändert habe, hat der Compiler keinen Fehler gemeldet. Warum kann ich eine int-Zahl zu einer Adresse hinzuaddieren? Das ergibt doch eigentlich keinen Sinn, oder?

    Du hast den Zeiger selbst um 1 erhöht. Wie man an den Wert hinter einem Zeiger kommt, erfährst du so ungefähr auf der ersten Seite des Kapitels über Zeiger in einem Lehrbuch.

    Ja, aber ich hatte es zuerst mit *p++; versucht. Das hat nicht funktioniert. Deswegen war ich etwas verwirrt, weil ich mit dem *-Operator ja eigentlich p dereferenziert haben müßte



  • Dexter1997 schrieb:

    Warum kann ich eine int-Zahl zu einer Adresse hinzuaddieren?

    Warum nicht? In C geht fast alles.



  • Stell dir vor ich habe eine Adresse:

    Buxdehude 17034
    Deutschland

    und eine Zahl: 1

    Wie addierst du diese beiden Daten?
    Verstehst du was ich meine?
    Ich verstehe das jedenfalls nicht 😃


  • Mod

    Dexter1997 schrieb:

    Stell dir vor ich habe eine Adresse:

    Buxdehude 17034
    Deutschland

    und eine Zahl: 1

    Wie addierst du diese beiden Daten?
    Verstehst du was ich meine?
    Ich verstehe das jedenfalls nicht 😃

    In C bekommt jedes Objekt auch noch seine eigene Strasse. Und für Arrays vergibt man in der Strasse für jedes einzelne Element eine Nummer (beginnend bei 0). Wenn eine Zahl zu einem Zeiger addiert wird, ändert sich die Hausnummer entsprechend:
    mit p =
    Arraystrasse 5
    Buxdehude 17034
    Deutschland

    p + 3 wird damit zu:
    Arraystrasse 8
    Buxdehude 17034
    Deutschland

    Objekte, die nicht zu einem Array gehören, kriegen die Hausnummer 0.
    Und in jeder Strasse gibt es eine Hausnummer hinter dem letzten Haus.
    Unter Umständen führen diese hauslosen Hausnummern zu Wurmlöchern zu anderen Strassen, diese Wurmlöcher sind aber in der Regel instabil.

    Postfixoperatoren (also solche die hinter dem Operanden stehen) haben Vorrang vor unären (Präfix-)operatoren. In

    *p++
    

    wirkt zunächst der Inkrementoperator auf die Variable p. Der in dieser Variablen gespeicherte Wert wird um eins erhöht; der ursprünglich in p stehende Wert füttert als Ergebnis den Dereferenzierungsoperator. Der Derefernzierungsoperator für sich alleine tut nicht wirklich etwas.

    Vermutlich wolltest noch Klammern setzen:

    (*p)++
    

    oder gleich Präfixinkrement verwenden:

    ++*p
    


  • Danke für die wunderbare Erklärung, dann ist soweit alles geklärt! 😃



  • Zur Sicherheit hier noch eine kleine Korrektur:
    der Ort nennt sich "Buxtehude" und hat die PLZ 21614. Buxdehude 17034 ist kein gültiger Ort. Allerdings hält dich in C niemand davon ab, Pointer auch auf nicht, noch nicht oder nicht mehr existierende Orte zu setzen 😉


Anmelden zum Antworten