2011-10-13 22 views
8

Jeśli mam tablicę zadeklarowane tak:sizeof Wskaźnik do tablicy

int a[3][2]; 

to dlaczego:

sizeof(a+0) == 8 

natomiast:

sizeof(a) == 24 

ja nie rozumiem, jak dodawanie 0 do wskaźnika zmienia dane wyjściowe sizeof. Czy jest jakiś niejawny rzut typu?

Odpowiedz

12

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.

+0

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. –

+0

@Remy Byłbym wdzięczny, gdybyś sformułował tę teorię i opublikował ją jako artykuł –

+2

@ RemyLebeau-TeamB: 'a [0]' jest równoważne '* (a + 0)', a nie '(a + 0)' . –

0

informuje o rozmiarze typu wyrażenia. Po dodaniu 0 do a typ staje się wskaźnikiem (8 bajtów w systemach 64-bitowych).

Powiązane problemy