„Rozpad” odnosi się do niejawnej konwersji wyrażenia z typu tablicowego na typ wskaźnika. W większości kontekstów, gdy kompilator widzi wyrażenie tablicowe, konwertuje typ wyrażenia z „tablicy N-elementowej T” na „wskaźnik do T” i ustawia wartość wyrażenia na adres pierwszego elementu tablicy . Wyjątki od tej reguły są przypadki, gdy tablica jest operand się z tych sizeof
lub &
operatorów, czy tablica jest ciągiem dosłowne używany jako inicjator w deklaracji.
Załóżmy następujący kod:
char a[80];
strcpy(a, "This is a test");
Wyrażenie a
jest typu „80-elementowa tablica char”, a wyrażenie „This is a test” jest typu „16-elementowa tablica char” (w C; w C ++ literały łańcuchowe to tablice const char). Jednak w wywołaniu do strcpy()
żadne wyrażenie nie jest operandem sizeof
lub &
, więc ich typy są domyślnie konwertowane na „wskaźnik na char”, a ich wartości są ustawiane na adres pierwszego elementu w każdym z nich. Co strcpy()
otrzymuje nie są tablice, ale wskaźniki, co widać w jego prototypu:
char *strcpy(char *dest, const char *src);
To nie to samo, co wskaźnik tablicowy. Na przykład:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
Zarówno ptr_to_first_element
i ptr_to_array
mają taką samą wartość ; adres bazowy Są to jednak różne typy i są traktowane inaczej, jak pokazano poniżej:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
Pamiętaj, że wyrażenie a[i]
jest interpretowane jako *(a+i)
(który działa tylko wtedy, gdy typ tablica jest przekształcany do typu wskaźnika), tak jak a[i]
i ptr_to_first_element[i]
działają tak samo. Wyrażenie (*ptr_to_array)[i]
jest interpretowane jako *(*a+i)
. Wyrażenia *ptr_to_array[i]
i ptr_to_array[i]
mogą prowadzić do ostrzeżeń lub błędów kompilatora w zależności od kontekstu; na pewno zrobią coś złego, jeśli oczekujesz od nich oceny a[i]
.
sizeof a == sizeof *ptr_to_array == 80
Ponownie, gdy tablica jest operandem sizeof
, nie jest konwertowana na typ wskaźnika.
sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
is on your platform
ptr_to_first_element
jest prostym wskaźnikiem do char.
int a[10]; int b(void);
,+a
jest on wskaźnikiem int i+b
jest wskaźnikiem funkcji. Przydatne, jeśli chcesz przekazać go do szablonu akceptującego referencję.