INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
++ (increment) mit Pointer Variable
11.09.2019, 11:35 (Dieser Beitrag wurde zuletzt bearbeitet: 11.09.2019 11:35 von Hoffmakl.)
Beitrag #1
++ (increment) mit Pointer Variable
Hallo zusammen,
eine Anfängerfrage: Warum funktioniert ein ++ (increment) nicht mit Pointer, oder mache ich einen Fehler?

Code:
int a = 1;

void setup() {
  printf("a= %d\r\n", a);   // a=1
  a++;
  printf("a= %d\r\n\n", a); // a=2

  int *p = &a;  

  *p = *p + 1;    
  printf("a= %d\r\n", a);   // a=3

  *p++;                
  printf("a= %d\r\n", a);   // a=3, Es wird nicht addiert ???
}

void loop() {
}

Benutzte Umgebung: ESP32 - WROOM-32 und IDE 1.8.9 Arduino.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2019, 11:39
Beitrag #2
RE: ++ (increment) mit Pointer Variable
Weil die Dereferenzierung (+) niederrangiger ist, als ++.
Bei *p++ erhohst Du also erst den Pointer und dann schaust Du dort nach, was da drin steht. Bei (*p)++ könntest Du das passende Ergebnis erhalten.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2019, 13:50 (Dieser Beitrag wurde zuletzt bearbeitet: 11.09.2019 13:50 von Hoffmakl.)
Beitrag #3
RE: ++ (increment) mit Pointer Variable
Hallo Tommy56,
Danke für die schnelle Antwort.

(*p)++ liefert das erwartete Ergebnis.

gemäß link zu den Ausführungsprioritäten befinden sich
* Dereferenzierung,
+ - unäres Plus und unäres Minus und
++ -- Präfix-Inkrement und -Dekrement

in der gleichen Priorität 3
Ich habe es noch nicht verstanden, was beim Parsen wie aufgelöst wird.

Zitat:Bei *p++ erhohst Du also erst den Pointer...
Die Pointeradresse und/oder der Inhalt des Pointers (&a) wird doch nicht verändert, oder?

Sorry, für meine naiven Fragen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2019, 14:24
Beitrag #4
RE: ++ (increment) mit Pointer Variable
Gemäß der verlinkten Tabelle ist ++ Prio 2 und Dereferenzierung Prio 3

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2019, 17:50 (Dieser Beitrag wurde zuletzt bearbeitet: 11.09.2019 17:53 von MartinZ.)
Beitrag #5
RE: ++ (increment) mit Pointer Variable
(11.09.2019 14:24)Tommy56 schrieb:  Gemäß der verlinkten Tabelle ist ++ Prio 2 und Dereferenzierung Prio 3

Gruß Tommy

Interessanterweise hat "postfix ++" ( also p++ ) die höhere Priorität 2
als "präfix ++" (also ++p) mit nur Priorität 3.

Da -wie Tommy schon sagte - die Dereferenzierung mit * nur Priorität 3 hat,
wird die in p gespeicherte Adresse um 1 erhöht (aber erst nach der Auswertung des Ausdrucks, da es ja "postfix" ist.).

Zur Dereferenzierung wird also noch die alte, nicht erhöhte Adresse verwendet, so dass der Wert noch aus der "richtigen" Adresse ausgelesen wird.
(Ja, tatsächlich ausgelesen: *p , egal ob da noch ++ hinter steht, liest aus. Und weil es nicht in einer Zuweisung verwendet wird, wird das Auslese-Ergebnis verworfen.)

Würde man anschließend noch einmal *p verwenden, würde aus der nächsten Adresse ausgelesen, was gefährlich ist, da die nicht mehr zur Variable gehört, auf die p zuerst gezeigt hat.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2019, 17:54
Beitrag #6
RE: ++ (increment) mit Pointer Variable
(11.09.2019 17:50)MartinZ schrieb:  Interessanterweise hat "postfix ++" ( also p++ ) die höhere Priorität 2
als "präfix ++" (also ++p) mit nur Priorität 3.
Ja, das ist gemein. Da bin ich auch schon drüber gestolpert.

Das hängt wahrscheinlich damit zusammen, dass x++ der historisch (ANSI C) häufigere Fall in Iterationen ist.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2019, 18:03
Beitrag #7
RE: ++ (increment) mit Pointer Variable
stimmt das Suffix-Inkrement hat Prio2 und das Präfix-Inkrement hat Prio 3.

Ich habe es getestet und es funktioniert alles so wie beschrieben:

(*p)++; // erhöht den Wert a um 1.
++*p; // erhöht den Wert a um 1.

und

*p++, // erhöht den Pointer (Speicheradressse von a ) um 4Byte, weil a vom typ int ist.

Danke für deine Hilfe.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2019, 18:08
Beitrag #8
RE: ++ (increment) mit Pointer Variable
(11.09.2019 18:03)Hoffmakl schrieb:  *p++, // erhöht den Pointer (Speicheradressse von a ) um 4Byte, weil a vom typ int ist.
Aber nicht auf einem 8-Bit-AVR. Von welchen Prozessor reden wir gerade?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  8 Bit als Variable Parallel einlesen Holzauge 2 386 13.08.2019 21:51
Letzter Beitrag: Holzauge
  Char in Int variable wandeln Rockman 5 639 06.03.2019 23:22
Letzter Beitrag: Tommy56
  Variable auf zwei Bytes aufteilen ? huber5093 4 680 05.03.2019 20:17
Letzter Beitrag: Tommy56
  Lokale Variable an loop zurück - Fehler Haukini 3 567 26.02.2019 22:33
Letzter Beitrag: Haukini
  Zahl aus txt-Datei als globale Variable einlesen Lance101 17 1.173 16.02.2019 14:38
Letzter Beitrag: Tommy56
  Pointer auf Struct-Werte im PROGMEM rkuehle 2 525 30.09.2018 18:15
Letzter Beitrag: rkuehle
  Problem mit Pointer GuaAck 6 1.011 02.09.2018 18:34
Letzter Beitrag: Tommy56
  Textdatei von SDKarte mit Arduiono lesen und als Variable abspeichern Christian_Moba-Arduino 2 695 25.08.2018 17:19
Letzter Beitrag: Tommy56
  Textdatei von SDKarte mit Arduiono lesen und als Variable abspeichern Christian_Moba-Arduino 0 561 25.08.2018 11:18
Letzter Beitrag: Christian_Moba-Arduino
  32-Bit Variable beschreiben mb817 18 2.855 10.04.2018 20:04
Letzter Beitrag: Mathias

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste