• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] typ void - Gdzie? Po co?

Aruba Cloud - Virtual Private Server VPS
0 głosów
3,628 wizyt
pytanie zadane 2 kwietnia 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

Witam!

 

Dotąd myślałem, że void to po prostu pusty typ danych, nic. Używany do funkcji które nic nie zwracają a tylko (może) coś robią. 

Pamiętam jak kiedyś jeden z użytkowników forum, bodajże mokrowski napisał mi, żebym jak na razie brał to tylko za właśnie pusty typ danych. Jednakże kiedy zobaczyłem to:

To zrobiłem wielkie oczy i jednak chcę się dowiedzieć co tak naprawdę void oznacza i jakim cudem można mieć do niego wskaźnik.

 

 

Pozdrawiam, Hiskiel.

3 odpowiedzi

+1 głos
odpowiedź 2 kwietnia 2018 przez mokrowski Mędrzec (158,200 p.)
edycja 2 kwietnia 2018 przez mokrowski
Typ void to typ niekompletny. Brak w nim informacji w jaki sposób go instancjonować w związku z tym obiekty typu void są niedozwolone. Nie można mieć ani obiektu ani referencji do niego ani także kontenerów z void. Typ ten zwracany jest z funkcji jako sygnał że... funkcja nic nie zwraca. Np. w języku Pascal lub podobnych, takie funkcje nazywane są procedurami.

Typ void *, stosowany jest do przechowywania adresu. Pozbawiony jest on informacji o tym na co wskazuje (na jaki typ) więc nie można go wyłuskać. Poddaje się w języku C i C++ rzutowaniu na wskaźnik dowolnego typu oraz ew. alokacji i dealokacji pamięci. Typ void * bywa stosowany na niskim poziomie do operowania na adresach na rejestry, "wskazywania miejsca". Tam gdzie decyzja o interpretacji typu (jego wielkości i znaczeniu), powinna być podjęta nieco później. Wskaźnik na void, może być gromadzony w kontenerach oraz przypisany do odpowiedniej zmiennej. NIe poddaje się jednak prawidłowej arytmetyce wskaźników (np. dodanie/odjęcie) bo nie wiadomo ma jaką wielkość wskazuje i w konsekwencji co ma być wynikiem. Do arytmetyki "co 1", bywa stosowany wskaźnik na char. void * bywa stosowany do sygnalizacji zwolnienia zasobu, wskazanie na nullptr (w C NULL).

W języku jakim jest C (bez plusów), gdzie nie występuje polimorfizm, void * bywa stosowany do tworzenia funkcji uniwersalnych (popatrz na qsort http://en.cppreference.com/w/c/algorithm/qsort ). Dopiero w innych funkcjach (w ich wnętrzu) następuje nadanie znaczenia wskaźnikowi.

Jednym słowem... w C++ jeśli nie schodzisz nisko do rejestrów sprzętowych, oprócz sygnalizacji "braku typu" w zasadzie (upraszczając) tylko jako typ zwracanej funkcji. Jeśli występuje, coraz częściej świadczy o nieprzemyślanej arch. rozwiązania. Upraszczając bo w kilku innych miejscach (np. przy szablonach) czasem się przydaje :-)
komentarz 7 kwietnia 2018 przez Hiskiel Pasjonat (22,830 p.)
No dobrze, a co powiesz na to?

https://i.imgur.com/wN3ExUd.png

Co się tam dzieje?

Pointer p na pointer void z nazwą funkcji.. O co tu chodzi?
komentarz 7 kwietnia 2018 przez mokrowski Mędrzec (158,200 p.)

W języku jakim jest C (bez plusów), gdzie nie występuje polimorfizm, void * bywa stosowany do tworzenia funkcji uniwersalnych...

A co ma się dziać? Otrzymujesz pointer i sam powinieneś wiedzieć "jako jaką funkcją go wołać". Zwróć uwagę jakie to jest wiązanie. W stylu C czy C++? Jak widać bez polimorfizmu (bo C nie ma polimorfizmu) więc nie ma innego wyjścia niż void *.

W kodzie w C jeszcze nie takie typy zobaczysz...

0 głosów
odpowiedź 2 kwietnia 2018 przez RafalS VIP (122,820 p.)
Typ void* może trzymać wskaźnik do każdego typu i do każdego typu można go rzutować. Ale lepiej nigdy nie stosować, bo nie da się na nim zrobić dereferencji, nie działa na nich arytmetyka wskaźnikowa, nie możesz zrobić inkrementacji takiego wskaźnika z oczywistego powodu - nie wiadomo co ile bajtów taki wskaźnik idzie.
Nie stosuj, bo to zła praktyka. No chyba że absolutnie musisz np przeładowując operator new i delete, albo pisząc coś w czystym C, gdzie jest o wiele mniej czytelnych i bezpiecznych narzędzi do zastąpienia tego typu funkcjonalności.
Ciekawostka malloc z C zwraca wskaźnik typu void ;p
0 głosów
odpowiedź 2 kwietnia 2018 przez Mariusz08 Maniak (62,280 p.)

O ile się nie mylę void służy do deklarowania wskaźników nieokreślonego typu.

Podobne pytania

0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
2 odpowiedzi 288 wizyt
0 głosów
3 odpowiedzi 3,929 wizyt
pytanie zadane 6 stycznia 2017 w C i C++ przez Marchewka900 Bywalec (2,970 p.)

93,335 zapytań

142,331 odpowiedzi

322,415 komentarzy

62,670 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...