Pusty typ danych
![]() | Ten artykuł od 2022-04 wymaga zweryfikowania podanych informacji. Należy podać wiarygodne źródła w formie przypisów bibliograficznych. Część lub nawet wszystkie informacje w artykule mogą być nieprawdziwe. Jako pozbawione źródeł mogą zostać zakwestionowane i usunięte. Sprawdź w źródłach: Encyklopedia PWN • Google Books • Google Scholar • Federacja Bibliotek Cyfrowych • BazHum • BazTech • RCIN • Internet Archive (texts / inlibrary) Dokładniejsze informacje o tym, co należy poprawić, być może znajdują się w dyskusji tego artykułu. Po wyeliminowaniu niedoskonałości należy usunąć szablon {{Dopracować}} z tego artykułu. |
Pusty typ danych (ang. void type) – typ danych, którego zmienna niesie zerową informację, czyli, zgodnie z teorią informacji, matematyczna klasa wszystkich wartości zmiennych tego typu zawiera dokładnie jeden element. Wprowadzenie takiego typu do systemu typów języka programowania umożliwia pewne rodzaje uogólnień - nie trzeba rozróżniać funkcji, które zwracają wartość, od tych, które jej nie zwracają (czyli zwracają wartość typu pustego), oraz funkcji, które pobierają jakiś argument, od tych, które tego nie robią.
Typ pusty stosowany jest głównie do:
- Wskazania, że funkcja nie zwraca wyniku (języki C, C++).
- Wskazania, że funkcja nie pobiera żadnych argumentów (konieczne w języku C, opcjonalne w C++)
- Definiowania wskaźników na dane nieokreślonego typu (języki C i C++).
Typy puste w językach programowania
- C, C++, Java, JavaScript, C# — typ
(void)
- języki ML —-
unit
Przykłady
Definiowanie funkcji niezwracającej wyniku
void wypisz_liczbe(int liczba) { printf("%d\n", liczba); }
W przykładzie tym (napisanym w języku C lub C++) słowo kluczowe void
wskazuje, że funkcja wypisz_liczbe
nie zwraca wartości.
Definiowanie funkcji bezargumentowych
int powitanie(void) { printf("Witaj!\n"); return 0; }
W przykładzie tym (napisanym w języku C) słowo kluczowe void
wskazuje, że funkcja powitanie
nie pobiera żadnych argumentów.
W języku C++ taka konstrukcja także jest dopuszczalna. Jednak taki sam rezultat da pozostawienie nawiasu pustego − w języku C oznaczałoby to, że funkcja przyjmuje nieokreśloną liczbę argumentów.
Definiowanie wskaźników do danych nieokreślonego typu
int n = 10; void *p = &n; int *pn = (int *) p; printf("n = %d\n", *pn);
W przykładzie tym zdefiniowano wskaźnik p
i przypisano mu adres zmiennej całkowitej n
. Ponieważ kompilator nie ma żadnej informacji o typie danych wskazywanych przez p
, nie wolno bezpośrednio wyłuskiwać danych wskazywanych przez p
. Aby uzyskać dostęp do tych danych, należy jawnie wskazać ich typ:
Przykład zaawansowany (qsort)
W standardowej bibliotece języka C występuje funkcja sortujaca qsort
o następującym prototypie:
void qsort (void *array, size_t count, size_t size, int (*compare_fun) (const void *a, const void *b))
- Ponieważ funkcja ta nie musi zwracać wyniku, typem jej wartości jest
void
- Ponieważ funkcji tej chcielibyśmy móc używać do sortowania tablic danych dowolnego, z góry nieznanego typu, dostęp do nich zapewniany jest przez wskaźnik
array
typuvoid*
. - Czwarty argument funkcji
qsort
sam jest funkcją i służy do ustalania kolejności sortowanych elementów. Typem obu argumentów tej funkcji też jestvoid*
, dzięki czemu może ona zostać użyta do sortowania tablic dowolnego typu
Uwagi
- Co prawda w języku C++ można posługiwać się wskaźnikami typu
(void *)
, jednak w praktyce z możliwości tej korzysta się tylko w kodzie współpracującym z bibliotekami napisanymi w C. W C++ istnieją bowiem bezpieczne mechanizmy praktycznie eliminujące potrzebę posługiwania się typem danych(void *)
: polimorfizm i typy parametryczne. - W C++ do definiowania funkcji bezargumentowych nie używa się słowa kluczowego
void
, lecz po prostu pozostawia się pustą listę argumentów.
int powitanie() { printf("Witaj!\n"); return 0; }
Ta sama konstrukcja w języku C interpretowana jest jako definicja funkcji o nieokreślonej (dowolnej) liczbie argumentów.
- p
- d
- e
Typy podstawowe |
|
---|---|
Typy złożone |
|