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 schlechtchar 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 charWenn ich jetzt schreibe
*p2 = 0xf00
schaut das dann nicht folgenderweise aus
&p2 irgendwo
value p2: 0x500&p1 0x500
value 0xf00&i 0x200
value intIrgendwie seh ich da keinen Sinn dahinter. Zerstöre ich mir dadurch doch nur das mein p1 nicht mehr auf &i zeigt ...
-
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]`