#include <iostream>
using namespace std;
int main () {
int value = 1, *pointer;
pointer = &value;
cout << *pointer++ << endl;
cout << *pointer << endl;
}
Warum ist die ++
Operator nicht inkrementieren value
?
#include <iostream>
using namespace std;
int main () {
int value = 1, *pointer;
pointer = &value;
cout << *pointer++ << endl;
cout << *pointer << endl;
}
Warum ist die ++
Operator nicht inkrementieren value
?
Nachinkrement ( ++
) hat einen höheren Vorrang als die Dereferenzierung ( *
) Dies bedeutet, dass die ++
bindet an pointer
statt *pointer
.
Voir C FAQ 4.3 und die darin enthaltenen Verweise.
Ok, alle haben die Bindung der Parameter erklärt.
Aber niemand hat erwähnt, was das bedeutet.
int data[1,2,3,4,5];
int* pointer = data;
std::cout << *pointer++ << std::endl;
std::cout << *pointer << std::endl;
Wie bereits erwähnt, hat der ++-Operator eine höhere Priorität und bindet daher fester als der *-Operator. Auch die Ausdrücke sind also gleichwertig:
std::cout << *(pointer++) << std::endl;
std::cout << *pointer << std::endl;
Der Operator ++ ist jedoch die Postfix-Version. Das bedeutet, dass der Zeiger inkrementiert wird, aber das Ergebnis der Operation den ursprünglichen Wert für die Verwendung durch den Operator * zurückgibt. Wir können die Anweisung also wie folgt ändern;
std::cout << *pointer << std::endl;
pointer++;
std::cout << *pointer << std::endl;
Das Ergebnis der Ausgabe ist also die Ganzzahl, auf die gerade gezeigt wird, aber der Zeiger wird auch inkrementiert. Der ausgegebene Wert ist also
1
2
pas
2
3
*pointer++
bedeutet *(pointer++)
.
d.h. der Zeiger wird inkrementiert, nicht der Zeiger selbst.
Eine Möglichkeit, sich daran zu erinnern, ist die Lektüre der Originalausgabe von K&R "The C Programming Language", in der das Beispiel von strcpy
verwendet dies.
Jedenfalls erinnere ich mich so an den Präzedenzfall.
und da es den Zeiger inkrementiert, hat Ihre zweite Dereferenzierung Undefined Behavior.
Prost & hth.,
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.