Po dodaniu 0
do a
, następnie a
jest najpierw przetwarzany na wartość wskaźnika typu int(*)[2]
(wskazując na pierwszy element tablicy typu int[3][2]
). Następnie dodano do tego 0
, który dodaje 0 * sizeof(int[2])
bajtów do adresu reprezentowanego przez tę wartość wskaźnika. Ponieważ to mnożenie daje 0, da to tę samą wartość wskaźnika. Ponieważ jest to wskaźnik, sizeof(a+0)
daje rozmiar wskaźnika, który wynosi 8 bajtów na twoim pudełku.
Jeśli wykonasz sizeof(a)
, nie ma powodu, aby kompilator konwertował a
na wartość wskaźnika (ma to sens tylko wtedy, gdy chcesz indeksować elementy lub wykonywać arytmetyczną wskazówkę dotyczącą adresu elementów). Tak więc wyrażenie a
pozostaje typu tablicowego, a rozmiar rozmiaru to . Tak więc, 3 * 2 * sizeof(int)
, które na twoim pudełku ma 24 bajty.
Mam nadzieję, że to wyjaśni.
Wywołanie 'sizeof (a + 0)' jest takie samo jak wykonanie 'sizeof (a [0])', które przyjmuje rozmiar pierwszego elementu 'int [2]' w tablicy, więc 'sizeof (int) * 2 = 8'. Nie przyjmuje wielkości wskaźnika. –
@Remy Byłbym wdzięczny, gdybyś sformułował tę teorię i opublikował ją jako artykuł –
@ RemyLebeau-TeamB: 'a [0]' jest równoważne '* (a + 0)', a nie '(a + 0)' . –