5. Pointer na void, pretypovanie

5.1 Pointer void *

Niekedy vznikne situácia, že potrebujeme použiť pointer, no nemusíme nevyhnutne vedieť na aký typ ukazuje (buď to naozaj nevieme, alebo nám jednoducho na tom momentálne nezáleží). V jazyku C máme k dispozícii špeciálny pointer tzv. void pointer (void*), ktorý môže ukazovať na ľubovoľnú premennú bezohľadu na jej typ. Takýto pointer sa zvykne nazývať generický (všeobecný), keďže môže ukazovať na ľubovoľný typ. Na čo nám tento všeobecný pointer vlastne je? Pozrime sa bližšie na nasledujúcu funkciu:

void nuluj(void *ptr, int dlzka) {
	for (; dlzka > 0; dlzka--) {
		*(char*)ptr = 0; /* vynulovanie bajtu */
		((char*)ptr)++; /* posun pointera o 1 bajt ďalej */
}

Má dva parametre: pointer na „nejaký“ úsek pamäte resp. adresu, na ktorej začína (môže to byť pointer na int, char…) a počet bajtov, ktoré je potrebné vynulovať. Bez použitia void pointeru by bolo písanie takýchto všeobecných funkcií oveľa zložitejšie. Okrem toho budeme pri programovaní často pracovať s funkciami, ktorých návratová hodnota je pointer na typ void. Takéto funkcie budeme bežne používať pri dynamickej alokácii pamäte (pozri funkciu malloc).

S údajovým typom void ste sa už určite stretli. Napr. pri definovaní „céčkovskej procedúry“ t. j. funkcie vracajúcej typ void (funkcie bez návratovej hodnoty). Typ void zvykneme používať aj v prípade, že chceme prekladač ujistiť o tom, že funkcia nemá žiadne formálne parametre, napr. void main(void) { … } (nie je to nevyhnutné, ale určite to prispieva k prehľadnosti programu)