Verständnisfrage zu Arrays und Pointern



  • Ich fange gerade an C zu lernen und verstehe bei dem angehängten Code nicht was genau in der while-Schleife passiert und warum diese überhaupt ausgeführt wird. Zum Zeitpunkt des Eintritts in die Schleife wird ja s und t verglichen, das sind ja beides Pointer: s zeigt ja auf ein Array mit 4 Elementen und t entspricht hier doch nur einem Array-Element, ist also kleiner als s. Wieso wird die while-Schleife dann ausgeführt?

    #include <stdio.h>
    #include <string.h>
    
    void print_reverse(char *s)
    {
        size_t len = strlen(s);
        char *t = s + len - 1;
        printf("t: %s\n",t);
        printf("s: %s\n",s);
        printf("length of t: %d\n",strlen(t));
        printf("length of s: %d\n",strlen(s));
        while ( t >= s) {
            printf("%c", *t);
            t = t - 1;
        }
        puts("");
    }
    
    int main()
    {
        print_reverse("Haus");
        return 0;
    }
    


  • t und s sind Zeiger, d. h. bei t >= s werden auch die Zeigerwerte verglichen -- die Positionen im Speicher, nicht das, was sich dort befindet. In dem Zusammenhang bedeutet "größer" quasi "weiter hinten."

    Dass die Zeichenkette, auf die t zeigt, kürzer ist als die, auf die s zeigt (weil sie ein Teil davon ist), steht auf einem anderen Blatt. Um den Vergleich zu haben, müsste da strlen(t) < strlen(s) stehen. Das bedeutet hier logisch das gleiche, wäre aber um einiges langsamer, weil jedes mal mindestens strlen(t) und (abhängig davon, wie gut dein Compiler optimieren kann) vielleicht auch strlen(s) neu ausgerechnet würde.



  • Okay, das ist mir jetzt klar. Habe es mir auch nochmal klar gemacht, indem ich mir die Adresse auf die t und s jeweils zeigen in der Schleife ausgeben lasse:

    Was ich jedoch immer noch nicht verstehe ist, warum t genau 3 Stellen "größer" ist als s?



  • s zeigt auf den Anfang von Haus , also auf das H .
    strelen("Haus") == 4
    also zeigt t genau 4-1=3 stellen weiter, auf den letzten Buchstaben s



  • Das macht Sinn, danke euch beiden für die Hilfe!


Log in to reply