2012-03-24 22 views

Odpowiedz

17

pierwsze, wskaźnik arytmetyka nie jest zdefiniowana, gdy wykonywane na niepowiązanych wskaźników.

Po drugie, ma to sens. Odejmując wskaźniki otrzymujesz liczbę elementów między tymi adresami, a nie liczbę bajtów.

Jeśli było spróbować z

char *p1 = &i, *p2 = &j; 

co można uzyskać inny wynik.


Na marginesie, podczas drukowania wskaźników używaj %p.

+0

Ściśle mówiąc, to prawda, ale każda implementacja, z jaką kiedykolwiek korzystałem, jest "właściwą rzeczą". Podobnie jest z PO. –

+0

@CarlNorum Yup, ja zredagowałem. – cnicutar

+0

Mam to. Dzięki! – Ava

2

Ściśle mówiąc, twój program powoduje kilka rodzajów niezdefiniowanych zachowań, najpierw ze względu na arytmetykę wskaźnika na niespokrewnionych wskaźnikach, a następnie przez niezgodne ciągi formatów i argumenty w instrukcjach drukowania. Jednak nawet jeśli zostały one poprawione, zobaczysz te same wyniki. Powód, dla którego różnica wynosi 1, polega na tym, że arytmetyka wskaźnika daje wyniki w jednostkach rozmiaru wskazanego typu - w twoim przypadku int jest typem 4-bajtowym, więc odjęcie int * wskaźników, które wskazują 4 bajty na siebie, daje wynik 1.

6

Jak powiedzieli inni, otrzymany wynik jest wielokrotnością rozmiaru, na który wskazują wskaźniki. Rzuć je, by były znakami char, a wynik, jaki otrzymasz, będzie pod względem bajtów. Należy również użyć parametru ptrdiff_t type, aby w systemach z 64-bitowymi wskaźnikami typ był wystarczająco duży, aby pomieścić wynik.

ptrdiff_t c = (char*)p - (char*)q; 

Należy również pamiętać, że przy różnicy adresy dwóch wartości, które nie są w tej samej tablicy jest niezdefiniowana w normie, ale działa na temat każdego systemu.

+0

Otrzymuję komunikat o błędzie dla "arytmetyczna na wskaźniki do unieważnienia", gdy próbuję to. –

+0

Okazuje się, że arytmetyka na wskaźnikach 'void *' jest [niestandardowym zachowaniem] (https://stackoverflow.com/a/3524270/1289657) obsługiwana tylko przez niektóre kompilatory z (poza) określonymi flagami. Zmieniłem odpowiedź, aby zamiast tego zalecać tylko wskaźniki "char *", które działają poprawnie i są standardowym zachowaniem. – AgentME

Powiązane problemy