Czy zwiększanie / zmniejszanie lub dodawanie wartości całkowitej do wskaźnika, który nie wskazuje na element w sekwencji Undefined Behavior?

Dec 07 2020

Wiem, że wskaźniki (do elementu tablicy) i iteratory mogą być zwiększane / dekrementowane, aby przejść przez sekwencję elementów i mogą przeskakiwać wstecz i do elementów w sekwencji.

Ale co się stanie, jeśli zwiększę wskaźnik do pojedynczego obiektu lub dodam do niego wartość całkowitą? czy jest to niezdefiniowane zachowanie, czy jest w porządku, ale nie możemy uzyskać dostępu do tej pamięci?

int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';

Ponieważ już przeczytałem, że nie powinniśmy zwiększać / zmniejszać wskaźnika, który nie wskazuje na przykład elementu w sekwencji lub tablicy.

Czy ktoś może więc wyjaśnić, co się stanie i czy mój przykład jest w porządku (wskaźnik usuwania referencji p)? Dziękuję Ci!

Odpowiedzi

2 告白气球 Dec 23 2020 at 16:33

gdy arytmetyka wskaźnika dotyczy wskaźnika, który wskazuje na obiekt, uważa się, że wskaźnik wskazuje na tablicę tego typu obiektu zawierającą tylko jeden element, zgodnie z normą .

W tym celu obiekt, który nie jest elementem tablicy, jest traktowany jako należący do tablicy jednoelementowej

W twoim przykładzie wskaźnik ptak, jakby wskazywał na int arr[1] = {551}Więc odpowiednia operacja jest podobna do zastosowania do wskaźnika, który wskazuje na arr. Oznacza to, ++pże pwskaże element arr [1] (hipotetyczny) i --pponownie pwskaże pierwszy element arr [0]. Tak więc w ostatnim przypadku wskaźnik usuwania odniesienia pjest OK i nie powoduje żadnego UB.