W deklaracji char *w, t[10]; zmienna w jest wskaźnikiem typu char*, a t jest tablicą 10 elementów typu char. Kluczowa zasada języka C mówi, że nazwa tablicy użyta w wyrażeniu (np. po prawej stronie przypisania) zazwyczaj ulega konwersji do wskaźnika na pierwszy element. To zjawisko bywa nazywane array-to-pointer decay.
Dlatego w wyrażeniu przypisania w = t; prawa strona (t) staje się wskaźnikiem typu char* wskazującym na pierwszy element tablicy, czyli zachowuje się jak &t[0]. Typ po lewej stronie to również char*, więc przypisanie jest poprawne.
Pozostałe odpowiedzi są błędne z powodów typów:
- "t[0] = w;" – t[0] ma typ char (pojedynczy znak), a w ma typ char* (adres). Przypisujesz więc wskaźnik do znaku, co jest niezgodne typowo i logicznie.
- "w = &t;" – operator & zastosowany do tablicy daje wskaźnik do całej tablicy. Typ &t to char (*)[10] (wskaźnik na tablicę 10 znaków), a nie char*. To inny typ wskaźnika, więc takie przypisanie jest niepoprawne (zwykle powoduje ostrzeżenie lub błąd kompilacji).
- "*w = t;" – lewa strona *w ma typ char (wartość pod adresem), a prawa strona po konwersji jest char*. Dodatkowo, jeśli w nie wskazuje na poprawną pamięć, samo użycie *w jest ryzykowne.
W praktyce ta zasada umożliwia przekazywanie tablic do funkcji poprzez wskaźnik na pierwszy element. Jednocześnie trzeba pamiętać, że t i &t mogą wskazywać ten sam adres liczbowo, ale mają różne typy, co ma znaczenie dla poprawności kodu.