Theoriefragen



  • Hallo Leute,
    ich möchte gerne etwas mehr darüber erfahren, was im inneren des systems eigentlich so vorsich geht. ich hoffe ihr könnt mir weiterhelfen.

    int a;
    scanf("%d", &a);
    

    Hier wird unter der adresse ein wert gespeichert?

    char a;
    scanf("%c", c);
    

    Hier fehlt mir der &-operator. Aber aus welchem Grund?

    void aendern_1(int x, int y, int z);
    void aendern_2(int *x, int *y, int *z);
    
    int main()
    {
        int a = 1;
        int b = 2;
        int c = 3;
    
        printf("aktuell %d-%d-%d\n", a,b,c);
    
        aendern_1(a,b,c);
        printf("nach fkt aendern_1: %d-%d-%d\n", a,b,c);
    
        aendern_2(&a,&b,&c);
        printf("nach fkt aendern_2: %d-%d-%d\n", a,b,c);
        return 0;
    }
    
    void aendern_1(int x, int y, int z)
    {
        x=4;
        y=0;
        z=0;
    }
    
    void aendern_2(int *x, int *y, int *z)
    {
        *x=0;
        *y=0;
        *z=0;
    }
    

    Ausgabe:
    aktuell 1-2-3
    nach fkt aendern_1: 1-2-3
    nach fkt aendern_2: 0-0-0

    Wieso wird in aendern_1 der wert nicht verändert? Kann man das garnicht?
    Was genau hat es mit aendern_2 auf sich? Wieso stehen die Argumtente mit & bestückt?

    Liebe Grüße ! 🙂



  • Wenn du einen Parameter übergibst, dann grundsätzlich als Kopie. Das heißt, egal was die Funktion mit diesem Parameter macht, interessiert den aufrufenden Code überhaupt nicht. Wenn du also willst, daß eine Variable des Hauptprogramms aus der Funktion geändert wird, darfst du nicht die Variable übergeben, sondern ihre Adresse - d.h. ein Pointer.

    Im Beispiel 3 übergibst du Werte an aendern_1() und Pointer (die auf die Variablen der main() verweisen) an aendern_2(). Beispiel 1 funktioniert analog - du übergibst scanf() einen Pointer auf deine Variable, so daß es die Eingabe dort reinschreiben kann.

    Beispiel 2 sieht stark nach einem Fehler aus - meintest du so etwas:

    char c[10];
    scanf("%c",c);
    

    Hier kommt die implizite Umwandlung von Arrays in Zeiger zum Tragen - ein Array kann häufig so verwendet werden, als wäre es ein Pointer auf das erste Array-Element.



  • ahh so ist das ok danke.
    Ja ist ein Fehler tut mir leid

    char a;
    scanf("%c", &a);
    

    weil ich möchte nur ein einzelnes zeichen einlesen und brauche doch meinen adressoperator.

    ich wollte eigentlich darauf hinaus warum ich bei

    char a[10];
    scanf("%s", a);
    

    keinen adressoperator brauche. ich lese quasi einen string ein der aber unter einer bestimmten adresse zu finden ist. Gibt es dafür eine Erklärung oder kann ich das einfach so hinnehmen?

    Hat es vielleicht ein wenig mit dem zu tun meintest du das?

    char *pointer;
    pointer=&a[0]; 
    pointer=a;
    


  • Dave01 schrieb:

    Hat es vielleicht ein wenig mit dem zu tun meintest du das?

    char *pointer;
    pointer=&a[0]; 
    pointer=a;
    

    Genau damit hat es etwas zu tun: Der Name des Arrays kann häufig (nicht immer ;)) als ein Zeiger auf das erste Element genutzt werden.



  • so is es... und grundsetzlich wurde für eine adresse ein zeichen/wert gewählt, so wird automatisch die nächst möglich höhere adresse gewählt und gefüllt. wesshalb
    auch folgendes problematisch sein kann:

    scanf("%s", a);
    

    es kann die array-grösse übertreten werden, sprich es wird auf speicher geschrieben,
    der schon von einem anderen teil des programmes verwendet wird. auf speicher der
    einem nicht gehört kann man nicht mehr so einfach zugreifen, da das Betriebssystem
    solche speicherzugriffe verwaltet. (wenn ich richtig aufgepasst habe ^^)..



  • danke euch 🙂


Anmelden zum Antworten