Erhöht / dekrementiert oder fügt ein Zeiger, der nicht auf ein Element in einer Sequenz zeigt, ein ganzzahliger Wert hinzu? Undefiniertes Verhalten?
Ich weiß, dass Zeiger (auf Array-Elemente) und Iteratoren inkrementiert / dekrementiert werden können, um eine Folge von Elementen zu durchlaufen, und dass sie in der Folge hin und her springen können.
Aber was passiert, wenn ich einen Zeiger auf ein einzelnes Objekt inkrementiere oder einen ganzzahligen Wert hinzufüge? Ist es ein undefiniertes Verhalten oder ist es in Ordnung, aber wir können nicht auf diesen Speicher zugreifen?
int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';
Weil ich bereits gelesen habe, dass wir einen Zeiger, der beispielsweise nicht auf ein Element in einer Sequenz oder einem Array zeigt, nicht inkrementieren / dekrementieren sollten.
Kann also jemand erklären, was passieren wird und ob mein Beispiel in Ordnung ist (Referenzierungszeiger p)? Vielen Dank!
Antworten
Wenn die Zeigerarithmetik auf einen Zeiger angewendet wird, der auf ein Objekt zeigt, wird davon ausgegangen, dass der Zeiger auf ein Array dieses Objekttyps mit nur einem Element zeigt, wie im Standard angegeben .
Ein Objekt, das kein Array-Element ist, wird zu diesem Zweck als zu einem Einzelelement-Array gehörend betrachtet
In Ihrem Beispiel ist der Zeiger so, p
als würde er auf int arr[1] = {551}
So zeigen. Die entsprechende Operation gilt ähnlich für einen Zeiger, der auf den zeigt arr
. Das heißt, ++p
zeigt p
auf das Element arr [1] (hypothetisch) und --p
zeigt erneut p
auf das erste Element arr [0]. Im letzten p
Fall ist der Referenzierungszeiger also in Ordnung und führt zu keiner UB.