Müssen Pointer Pointer immer auf Pointer zeigen ?



  • vielen dank für die Mühe an euch beiden. Wäre auf das nie gekommen. Habe diese Syntax noch bei keinem Beispiel gesehen. Habe jetzt mal alles notiert und werde weitermachen. Bin wahrscheinlich zu blöd um diese einwandfrei zu verstehen 😉

    Die letzte wichtige Erkenntnis zum Schluss war noch

    int** a;
    **a ist vom typ int // das war mal nicht schlecht 😉

    char c = 'c'
    char* p1 = &c;
    char** p2 = &p1;
    
    **p2 = 'x'; // Das ist sinnvoll. Hoffe ich jedenfalls 
    *p2 = 0x1234; //sinnlos da irgendwo hinzeigt ?
    p2 = 0x9876; //sinnlos da irgendwo hinzeigt ?
    

    p2 -> p1 ->c

    &p2 irgendwo
    value p2: 0x500

    &p1 0x500
    value 0x200

    &i 0x200
    value char

    Wenn ich jetzt schreibe

    *p2 = 0xf00

    schaut das dann nicht folgenderweise aus

    &p2 irgendwo
    value p2: 0x500

    &p1 0x500
    value 0xf00

    &i 0x200
    value int

    Irgendwie seh ich da keinen Sinn dahinter. Zerstöre ich mir dadurch doch nur das mein p1 nicht mehr auf &i zeigt ...


  • Mod

    Im großen und ganzen richtig (Die Syntax bei "a**" ist falsch. "**a" muss das heißen).

    Bullz schrieb:

    Irgendwie seh ich da keinen Sinn dahinter.

    Du hast korrekt erkannt, dass es selten sinnvoll ist, einem Zeiger direkt einen Zahlenwert (außer vielleicht 0) zuzuweisen.



  • ich hab schon bissi java Programmiert aber ich bin noch nie wo so lange dran gesessen wie an den Pointern...

    Mit Feldern kann ich wesentlich einfacher arbeiten... sobald irgendetwas komplett neues auf mich zukommt steh ich wieder blöd da.

    Würde ja auf diesen Teil gern verzichten. Komme mit der Feldnotation wesentlich besser zurecht aber dann werd ich kaum fremden Code lesen können.

    int main(int argc,char* argv[])
    {
    //....
    // Leicht verständlich und funktioniert bestens
    switch (argv[2][0]) 
    // Durch reines rumprobieren ohne Hirn
    switch (**(argv+2))
    // 
    {
    case '+':
    /...
    }
    }
    

    Was wäre aber wenn ich auf argv[2][1] mit Pointernotation zugreifen wollen würde ?
    Meine vielversprechenden weltenverbesserenden Ansatz
    switch(*argv+1*(argv+2));

    Das beste ist er frisst es sogar. Bekomme aber Fehlermeldung:
    Ungültiger Operanden für binäres * (haben int und char**)



  • *argv+1*(argv+2)); 
           ^
           Der * ist der Multiplikationsoperator. Der braucht zwei Operanden. Daher binär
    Die 1 ist ein int und (argv+2) ist char**
    

    `

    argv+2 ist wie argv[2] (ein char)

    *(*argv+2) ist argv[2][0] (ein char. Es wird auch zweimal dereferenziert (mit zwei *))

    *((*argv+2)+1) ist argv[2][1]`



  • danke... jetzt verstehe ich langsam wie das mit den Pointern geht. Ist ja wie mit Feldern nur ein wenig verkehrt gedacht ...

    Trotzdem funktioniert dein Statement nicht bei mir

    switch(argv[2][1])  // funktioniert
    switch(*((*argv+2)+1)) // dont work
    


  • Schäm.
    Da waren die Klammern falsch 🙄
    `(argv+2) ist wie argv[2] (ein char)

    **(argv+2) ist argv[2][0] (ein char. Es wird auch zweimal dereferenziert (mit zwei *))

    ((argv+2)+1) ist argv[2][1]`


Anmelden zum Antworten