Stringtabellen und Zeiger auf Zeiger



  • Hallo 😃

    Ich habe ein kleines Verständnisproblem mit Stringtabellen sowie Zeiger auf Zeiger.
    Folgendes Listing:

    /* ptrptr3.c */
    #include <stdio.h>
    #include <stdlib.h>

    int main(void) {
    char *sort[] = {
    "Zeppelin", "Auto", "Amerika", "Programmieren"
    };
    printf("%p = %c\n", **sort, **sort);
    printf("%p = %c\n", *sort[0], *sort[0]);
    printf("%p = %c\n", *(sort[0]+0), *(sort[0]+0));

    printf("%p = %s\n", sort[0], sort[0]);
    printf("%p = %s\n", *sort, *sort);

    printf("%p = %s\n", (sort[0]+1), (sort[0]+1));
    printf("%p = %s\n", (sort[0]+2), (sort[0]+2));

    printf("*sort = %p, **sort = %p\n", *sort, **sort);
    return EXIT_SUCCESS;
    }

    Ich verstehe einfach nicht, warum die erste Ausgabe das Z von Zeppelin ist.
    Was versteht der Compiler, wenn ich **sort schreibe? Ich habe doch nirgendswo **sort in irgendeinerweise deklarier. 😕 Und warum wird als Adresse bei den ersten drei immer 0x5a ausgegeben. Eine Adresse ist doch eigentlich immer eine lange Zahl wie 0x123456789.

    Vielen Dank!

    LG


  • Mod

    Wenn du beide Male **sort ausgibst, dann bekommst du logischerweise beide Male den Wert von **sort. Also 'Z'. Der Formatspezifizierer von scanf gibt nur an, auf welche Art und Weise ein Wert ausgegeben wird. %p gibt das 'Z' dann eben als seinen hexadezimalen Zahlenwert, 5A, aus, %c hingegen in seiner Zeichendarstellung, Z. Formatstrings holen sich nicht auf magische Weise neue Werte, etwa die Adresse eines Objekts, sondern es wird genau der Wert ausgegeben, den du angibst. Und es ist deine Verantwortung, dass das auch passt. Hier hattest du insofern "Glück", als dass bei dir char ein Typ ist, der auf deinem System anscheinend mit einem Zeigertyp kompatibel ist, aber das hätte auch schiefgehen können.

    Zu deiner anderen Frage: 😕 Du weißt, was Zeiger sind? Wenn ja, dann sollte doch klar sein, dass **sort der dereferenzierte Wert des dereferenzierten Werts von sort ist. sort ist zwar als Array definiert, aber sort als Ausdruck wird als Zeiger auf das erste Element des Arrays aufgefasst. Demnach ist sort als ein Zeiger auf das Zeichenkettenliteral "Zeppelin". *sort ist das Zeichenkettenliteral "Zeppelin" (welches als ein Array wieder als ein Zeiger auf sein erstes Element gilt). Und letztlich **sort ist das erste Element dieses Zeichenkettenliterals, also 'Z'.

    Da irgendein_array[0] das gleiche ist wie *irgendein_array, ist *sort[0] logischerweise das gleiche wie **sort.



  • **sort ist für den Compiler wie *sort[0], weil allgemein für Arrays *a so etwas wie a[0] ist.

    sort[0] ist "Zeppelin", also *sort[0] nach der gleichen Ersetzung wie oben das erste Zeichen von sort[0], also "Z".



  • Achso ok, ich glaube ich habe es verstanden. 🙂

    thx!


Log in to reply