Pointer / Referenzen Frage



  • Hallo,

    Ich habe eine allgemeine Verständnisfrage zu Pointer und Referenzen.

    Also:

    Wenn ich z.B. die Variable

    char c* = "test";

    initalisieren, dann bedeutet der *, welcher in dem Fall Deklarationsoperator ist, dass die Varible c eine Pointervariable ist.

    Also in c wird nicht "test" gespeichert, sondern nur die Adresse auf den Start der Zeichenkette. Wann die Zeichenkette zuende ist erkennt der Computer durch die Nullterminierung.

    Wenn ich auf diese Variable zugreife, habe ich folgende Möglichkeiten:

    putc(c ,stdout) // Das würde jetzt die Adresse an der "test" beginnt ausgeben
    putc(&c, stdout) // Das würde jetzt die Adresse angeben, an der die Zeigervariable selbst gespeichert ist

    putc(*c, stdout) //Das würde jetzt den Inhalt der Adresse in c ausgeben. Also würd es "t" ausgeben (weil putc nur einen Char ausgibt).

    Soweit richtig denke ich, oder?

    Jetzt habe ich hier folgendes:

    Ich habe eine Funktion:

    int printstring(char *c)
    {
    printf("String %s", *c);
    return 0;
    }

    Ist das korrekt zu sagen, dass die Funktion eine Zeigervariable vom Typ Char annimmt?

    Wenn ja, warum funktioniert folgendes nicht (in der Main-Funktion einer anderen Datei):

    var *c = "Testtest";

    printstring(c);
    printstring(*c);

    Es funktioniert alles nicht.

    Wie übergebe ich so eine Zeigervariable, oder besser gesagt: Wie nehme ich sie in der Funktion richtig "entgegen" ?

    Vielen Dank.



  • kthesun schrieb:

    putc(c ,stdout) // Das würde jetzt die Adresse an der "test" beginnt ausgeben
    putc(&c, stdout) // Das würde jetzt die Adresse angeben, an der die Zeigervariable selbst gespeichert ist

    putc(*c, stdout) //Das würde jetzt den Inhalt der Adresse in c ausgeben. Also würd es "t" ausgeben (weil putc nur einen Char ausgibt).

    falsch. man: putc(3) schreibt das Charakter, nicht die Zeichenkette, ergo

    putc(c ,stdout) schreibt das Character, welches nach der Konvertierung von (void*) (bzw. ptrdiff_t) zu int entsteht. Siehe man: ascii(7), da ist die Tabelle von möglichen Zeichen. Der Compiler sollte eine Warnung abgeben.

    putc(&c, stdout) dito, aber mit der Adresse, wo der Zeiger gespeichert ist

    putc(*c, stdout) richtig

    kthesun schrieb:

    Jetzt habe ich hier folgendes:

    Ich habe eine Funktion:

    int printstring(char *c)
    {
    printf("String %s", *c);
    return 0;
    }

    Ist das korrekt zu sagen, dass die Funktion eine Zeigervariable vom Typ Char annimmt?

    es ist korrekt das zu sagen. Die Funktion ist dennoch falsch, weil printf einen Zeiger auf eine 0-terminierende Zeichenkette erwartet und mit *c übergibst du ein Zeichen, printf interpretiert das Zeichen aber als die Anfangsadresse der Zeichenkette, was in segfault enden kann. Korrekt wäre

    int printstring(char *c)
    {
     printf("String %s", c);
     return 0;
    }
    

    oder

    int printstring(char *c)
    {
     printf("1. Zeichen %c", *c);
     return 0;
    }
    

    kthesun schrieb:

    Wenn ja, warum funktioniert folgendes nicht (in der Main-Funktion einer anderen Datei):

    var *c = "Testtest";

    printstring(c);
    printstring(*c);

    siehe oben. printstring erwartet einen Zeiger, also musst du einen Zeiger übergeben (also ist der zweite Aufruf einfach syntaktisch falsch).



  • kthesun schrieb:

    Wie übergebe ich so eine Zeigervariable, oder besser gesagt: Wie nehme ich sie in der Funktion richtig "entgegen" ?

    mit ausnahme des anlegens eines pointers brauchst du das sternchen nur, wenn du den pointer dereferenzieren (also auf das zugreifen willst, worauf er zeigt). wenn du seinen namen ohne * verwendest, ist der pointer selbst gemeint (entspricht der adresse von dem, worauf er zeigt). also: herumreichen von (einfachen) pointern immer ohne sternchen, zugreifen auf die daten selber mit sternchen.
    🙂


Anmelden zum Antworten