Zeiger



  • Hallo!

    Ich habe eine Frage zu folgendem Beispielcode:

    char* p;        
    memset(WorkString, 0x00, sizeof(WorkString));
    p = strstr(Buffer, TestString);
    if(p == 0) {
             return WorkString;	
    } else {
             if ('R' != p[0]) {	
    		     p++;
                ...
    

    p ist also ein Zeiger auf ein char-Objekt. Mit strstr(Buffer, TestString) wird diesem p die Adresse der Stelle angezeigt, an der TestString im Buffer vorkommt. Soweit denke ich stimmt das, oder?
    Was mir jetzt unklar ist: was bedeutet if ('R' != p[0]) ? Heißt das, falls die Adresse nicht mit 'R' beginnt?
    Falls ja: was sind das für spezielle Adressen, die mit einem R beginnen? Ich wundere mich nämlich, warum dafür extra eine if-Schleife gemacht wird.

    Schon mal ein dickes Danke für eure Hilfe!

    Liebe Grüße,
    Julia 🙂



  • Hallo.

    P ist ein char-Pointer, der nach strstr() auf den ersten Index von TestString innerhalb des Strings Buffer zeigt. p[0] gibt nun das Zeichen zurück, das genau an dieser Adresse steht. Dann wird geprüft, ob das Zeichen ein "R" ist. Alles halb so wild 🙂

    Wenn du mehr über diese Verhalten von p[0] wissen möchtest und auch, was das p++ in Zeile 8 soll, such mal nach "Zeigerarithmetik".

    Achja, bitte nicht "If-Schleife" sagen. If ist keine Schleife 😉

    gruß
    Martin



  • Auch wenn das eher ins C Forum gehört (der Code enthält nichts was ihn als C++ Code kennzeichnet) mal eine Antwort...

    julchen81 schrieb:

    ...p ist also ein Zeiger auf ein char-Objekt. Mit strstr(Buffer, TestString) wird diesem p die Adresse der Stelle angezeigt, an der TestString im Buffer vorkommt.

    Ungünstige Formulierung, Besser: zugewiesen (p enthält anschließend ja die Adresse an der entsprechenden Stelle)

    julchen81 schrieb:

    Soweit denke ich stimmt das, oder?
    Was mir jetzt unklar ist: was bedeutet if ('R' != p[0])? Heißt das, falls die Adresse nicht mit 'R' beginnt?

    Du musst hier eins Wissen: Die Arraysyntax kann man auch auf Zeiger anwenden. p[0] besagt: gibt mir das erste Element ausgehend von der Adresse p zurück (p[0] ist also der Inhalt der Speicherzelle auf die p verweist). Da es sich hier um einen Zeiger auf char handelt, ist hierbei ein char gemeint.

    "if ('R' != p[0])" Besagt also Wenn das Zeichen an der Adresse p kein 'R' ist dann...

    cu André
    P.S: Bitte demnächst das richtige Forum verwenden.



  • hey,

    ich bin mir jetzt nicht sicher, ob ich das so ganz verstanden habe:
    wenn also z.B. TestString = "R10", dann liefert doch p[0] ein R, weil dieser TestString mit einem R beginnnt. p[0] liefert also das erste Zeichen dieses TestStrings? 😕

    Würd mich freuen, noch mal von dir zu hören... 😃

    Und danke für den Tipp mit der if-Schleife (war jetzt aber das letzte Mal, dass ich das schreib!), mir kam dieser Ausdruck sowieso irgendwie eigenartig vor.

    Julia



  • julchen81 schrieb:

    ich bin mir jetzt nicht sicher, ob ich das so ganz verstanden habe:
    wenn also z.B. TestString = "R10", dann liefert doch p[0] ein R, weil dieser TestString mit einem R beginnnt. p[0] liefert also das erste Zeichen dieses TestStrings? 😕

    Ein C-String ist nichts anderes als ein Array von Werten.
    In deinem Beispiel (TestString = "R10") würde:
    p[0] = 'R'
    p[1] = '1'
    p[2] = '0'
    p[3] = '\0'
    sein...

    cu André
    P.S: Wenn du C++ verwendest bitte möglichst auch std::string statt char-Arrays verwenden, wirst es damit leichter haben.



  • Wie hübsch, ich hab's verstanden 😃 😃

    Und dank dir auch für den zusätlichen Tipp zu std::string, aber ich hab den Code nicht selbst programmiert, der ist aus dem Beispielprogramm, das ich durcharbeiten muss.

    Liebe Grüße und noch einen schönen Tag!
    Julia 🙂



  • Vieleicht hilft dir dieses construct auch noch.

    Wenn p ein Pointer ist, dann sind folgende Ausdrucke equivalent.

    p[0] equivalent zu *(p + 0)


Anmelden zum Antworten