3 Stimmen

Wie funktioniert in C++ der Ausdruck "*pointer++"?

#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 ?

10voto

NPE Punkte 462670

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.

7voto

Martin York Punkte 245363

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

3voto

casablanca Punkte 68114

++ hat einen höheren Vorrang als * Ihr Ausdruck ist also äquivalent zu *(pointer++) -- Er dereferenziert den Wert und erhöht dann den Zeiger, nicht den Wert. Wenn Sie den Wert inkrementieren wollen, müssen Sie Folgendes tun (*pointer)++ .

1voto

Cheers and hth. - Alf Punkte 138555

*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.,

0voto

Juan Pablo Santos Punkte 1150

Sie erhöhen den Wert des Zeigers, nicht den Wert, auf den der Zeiger zeigt.

CodeJaeger.com

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.

Powered by:

X