KWALIFIKACJA INF2 + INF3 - CZERWIEC 2012

PYTANIE NR 29.
Zmienne w oraz t zadeklarowano jako char *w, t[10];. Wskaż przypisanie adresu tablicy t wskaźnikowi w.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Wyrażenie t w C w większości kontekstów wyrażeń ulega konwersji do wskaźnika na pierwszy element, czyli jest równoważne &t[0] typu char*. Dlatego przypisanie "w = t;" poprawnie zapisuje adres początku tablicy do wskaźnika. Pozostałe propozycje mają niezgodne typy lub błędną stronę przypisania.

Pełne wyjaśnienie:

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.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Oznacza to, że w jest wskaźnikiem typu char*, a t jest tablicą 10 elementów typu char. To dwie różne konstrukcje: wskaźnik przechowuje adres, a tablica przechowuje kolejne znaki w pamięci.
W C nazwa tablicy użyta w wyrażeniu zwykle konwertuje się do wskaźnika na pierwszy element. Dlatego t zachowuje się jak &t[0] typu char*, co pasuje do typu wskaźnika w.
To reguła, że tablica w kontekście wyrażeń "zanika" do wskaźnika na pierwszy element. Nie zmienia to samej tablicy, ale zmienia typ wyrażenia. Dzięki temu tablice można przekazywać do funkcji jako wskaźniki.
t w wyrażeniu zwykle staje się wskaźnikiem char* na pierwszy element. Natomiast &t ma typ wskaźnika do całej tablicy, np. char (*)[10]. Adres liczbowo może być ten sam, ale typ i arytmetyka wskaźników są inne.
Tak. w = &t[0]; jest równoważne intencji "wskaż początek tablicy" i ma zgodny typ char*. Zapis w = t; działa, bo t konwertuje się do &t[0] w takim kontekście.
Ponieważ &t nie jest typu char*, tylko wskaźnikiem do tablicy: char (*)[10]. To inny typ wskaźnika, więc przypisanie do char* jest niezgodne typowo i kompilator zwykle zgłosi ostrzeżenie lub błąd.
t[0] to pojedynczy element tablicy, czyli zmienna typu char. Natomiast w jest wskaźnikiem (char*), czyli adresem. Przypisywanie adresu do znaku miesza typy i nie realizuje celu "przypisać adres tablicy".
Nawet jeśli w byłby poprawnie ustawiony, lewa strona *w ma typ char, a prawa strona t po konwersji ma typ char*. To nadal niezgodność typów. To zadanie dotyczy przypisania adresu, a nie zapisu znaku.
Najczęściej wyjątki to użycie operatora sizeof, operatora & na tablicy oraz kontekst inicjalizacji tablicy. W tych przypadkach tablica zachowuje swój "tablicowy" typ, a nie typ wskaźnika na pierwszy element.
Często pojawiają się pytania o poprawne przekazanie tablicy do funkcji, o typy wyrażeń (t, &t, &t[0]) oraz o interpretację błędów kompilatora dotyczących niezgodności typów wskaźników. Warto ćwiczyć na krótkich przykładach.
info

Statystycznie 54% uczniów zna prawidłową odpowiedź. trudne

Według specjalistów z branży: "Wyrażenie t w C w większości kontekstów wyrażeń ulega konwersji do wskaźnika na pierwszy element, czyli jest równoważne &t[0] typu char*."

Źródła:

  • ISO/IEC 9899:2018 (C17), rozdział 6.3 (Conversions), część dotycząca konwersji tablicy do wskaźnika
  • cppreference.com: "Array to pointer conversion" https://en.cppreference.com/w/c/language/array (dostęp: 2026-02-28)
  • Brian W. Kernighan, Dennis M. Ritchie, "The C Programming Language", 2nd edition, rozdział o wskaźnikach i tablicach (Pointers and Arrays)

Materiały:

  • Dokumentacja standardu języka C (sekcja o konwersjach wyrażeń i tablic)
  • Materiał o różnicach między tablicą a wskaźnikiem (kurs C dla początkujących)
  • Ćwiczenia z typami: porównanie t, &t, &t[0], sizeof(t), sizeof(&t)

Aktualizacja pytania: 03.04.2026



Aktualizacja pytania: 03.04.2026
📡 Brak połączenia internetowego