unknown: (C) Grundsatzfragen zu Zeiger

Beitrag lesen

»»Bei der Ausgabe von printf ist es für mich wieder logisch, wnen ich **argv ausgebe, aber warum inkrementiere ich dann nicht auch in der 2. Schleife so: (**argv)++, bzw ++**argv?

weil du dann die einzelnen buchstaben inkrementieren würdest.
argv++ geht immer von einem argument zum nächsten (++ auf pointer auf pointer (array) auf Buchstaben)
(*argv)++ geht von buchstabe zu buchstabe (++ auf pointer (array) auf Buchstaben)
(*(*argv))++ inkrementiert den 1. buchstaben (++ auf Buchstaben)

Eines verstehe ich dabei noch weniger. Ich könnte genauso gut folgendes schreiben

pre- und postfix operatoren:
a++; merkt sich erst den wert, inkrementiert diesen und kiefert den gemerkten
++a; inkrementiert erst und liefert dann den inkrementiertn wert

int a = 7;
int b = a++; // b ist 7 und a ist 8
int c = ++b; // c ist 8 und b ist 8

hier in der schleife ist das eigentlich egal. beim (*argv)++ wird zwar ein nicht benötigtes temporary angelegt, ein guter compiler sollte das aber bei einfachen datentypen wegoptimieren.

(*argv)++ erhöht doch den WERT, worauf der Zeiger zeigt, d.h. würde an dieser Stelle ein "u" stehen, müsste dieses "u" auf ein "v" inkrementiert werden, da "v" das nächste Zeichen nach "u" ist. Tut es aber nicht. Es funktioniert so richtig. Logisch wäre für mich aber wieder gewesen, wenn ich *(argv++) schriebe, denn das inkrementiert den Zeiger doch auf die nächste Position.

(*argv)++ inkrementiert den dereferenzierten pointer auf pointer auf buchstaben. also den pointer auf buchstaben.
*(argv++) inkrementiert den pointer auf pointer auf buchstaben und dereferenzierten ihn dann. also bei ["123", "345", "678"] und argv zeigt auf den anfang, würde erst argv auf "345" gesetzt und dieses zurückgegeben. im ersten fall wurde der inhalt von argv inkrementiert (also "123" wurde zu "23")