Lasst uns annehmen,
int *p;
int a = 100;
p = &a;
Was macht der folgende Code eigentlich und wie?
p++;
++p;
++*p;
++(*p);
++*(p);
*p++;
(*p)++;
*(p)++;
*++p;
*(++p);
Ich weiß, das ist in Bezug auf die Codierung etwas chaotisch, aber ich möchte wissen, was tatsächlich passieren wird, wenn wir so codieren.
Hinweis: Nehmen wir an, dass die Adresse von a=5120300
in einem Zeiger gespeichert ist, p
dessen Adresse lautet 3560200
. Was ist nun der Wert p & a
nach der Ausführung jeder Anweisung?
printf
wird einen Zeiger mit% p druckenAntworten:
Erstens hat der Operator ++ Vorrang vor dem Operator *, und die Operatoren () haben Vorrang vor allem anderen.
Zweitens ist der ++ - Zahlenoperator der gleiche wie der Zahl ++ - Operator, wenn Sie sie nichts zuweisen. Der Unterschied besteht darin, dass Zahl ++ die Zahl zurückgibt und dann die Zahl erhöht, und die Zahl ++ zuerst erhöht und dann zurückgibt.
Drittens erhöhen Sie den Wert eines Zeigers, indem Sie ihn um die Größe seines Inhalts erhöhen, dh, Sie erhöhen ihn, als würden Sie in einem Array iterieren.
Um es zusammenzufassen:
Da es hier viele Fälle gibt, habe ich möglicherweise einen Fehler gemacht. Bitte korrigieren Sie mich, wenn ich falsch liege.
BEARBEITEN:
Ich habe mich also geirrt, der Vorrang ist etwas komplizierter als das, was ich geschrieben habe. Sehen Sie ihn hier an: http://en.cppreference.com/w/cpp/language/operator_precedence
quelle
überprüfte das Programm und die Ergebnisse sind wie folgt:
quelle
Das Folgende ist eine Instanziierung der verschiedenen Vorschläge zum Ausdrucken. Ich fand es lehrreich.
Es kehrt zurück
Ich habe die Zeigeradressen auf geworfen
int
s gesetzt, damit sie leicht verglichen werden können.Ich habe es mit GCC zusammengestellt.
quelle
In Bezug auf "Wie inkrementiere ich eine Zeigeradresse und einen Zeigerwert?" Ich denke, das
++(*p++);
ist eigentlich gut definiert und macht das, wonach Sie fragen, zB:Es wird nicht zweimal vor einem Sequenzpunkt dasselbe geändert. Ich denke nicht, dass es für die meisten Zwecke ein guter Stil ist - es ist ein bisschen zu kryptisch für meinen Geschmack.
quelle
++*p++
Inkrementiert erfolgreich sowohl den Wert als auch den Zeiger (Postfix++
bindet stärker als Dereferenzierung*
, und dies geschieht++
aufgrund der Reihenfolge vor dem Präfix ). Die Klammern sind nur erforderlich, wenn Sie den Wert vor dem Inkrementieren benötigen(*p++)++
. Wenn Sie alle Präfixe verwenden,++*++p
funktioniert dies auch ohne Klammern einwandfrei (erhöhen Sie jedoch den Wert, auf den nach dem Zeigerinkrement verwiesen wird).quelle