W kodzie:
m[1] - m[0]
oznacza odejmowanie wskaźnik, który daje różnicę dwóch wskaźników opartych na typu. W tym przypadku oba wskaźniki są zróżnicowane od 3 elementów, więc wynik jest 3.
Cytując standardu C11
, rozdział §6.5.6
Gdy dwa wskaźniki są odejmowane, oba elementy powinny wskazywać tego samego obiektu tablicowego, lub jeden za ostatnim elementem obiektu tablicy; wynikiem jest różnica dolnych indeksów dwóch elementów tablicy. [...]
i
[...] Innymi słowy, jeśli wyrażenia P
i Q
punkt do, odpowiednio, i j
i
-tego -tego elementy się obiekt tablicy, wyrażenie (P)-(Q)
ma wartość i−j
pod warunkiem, że wartość mieści się w obiekcie typu ptrdiff_t
. [....]
Aby lepiej uzmysłowić, proszę zobaczyć na poniższym obrazie
Tutaj s
jest dwuwymiarowa tablica, zdefiniowane jako s[4][2]
. Biorąc pod uwagę typ danych dla użytkowników macierzy 2-bajtowych, należy postępować zgodnie z elementami (indeks) i odpowiednią lokalizacją pamięci (arbitralna). Pozwoli to lepiej zrozumieć, jak faktycznie w pamięci elementy tablicy są ciągłe.
Tak, jak na reprezentację, s[0]
i s[1]
są zróżnicowane przez dwóch elementów, s[0][0]
i s[0][1]
. W związku z tym, s[1] - s[0]
da wynik 2.
'm [1]' to 'i m [1] [0]' i tak dalej. – immibis
Technicznie "m" nie jest macierzą 3x3, ale tablicą tablic. – HelloGoodbye
Nie ma na to odpowiedzi, ale 'm [0]' i 'm [1]' to * tablice * (nie wskaźniki). Wartość wskaźnika jest tworzona, gdy tablica jest używana jako operand operatora '-', który wskazuje na pierwszy element odpowiedniej tablicy. –