Особым случаем указателей является бестиповый указатель. Ключевое слово void используется для того, чтобы показать, что указатель означает просто адрес памяти, независимо от типа величины, находящейся по этому адресу:
void* ptr; Для указателя на тип void не определена операция ->, не определена операция обращения по адресу *, не определена адресная арифметика. Использование бестиповых указателей ограничено работой с памятью при использовании ряда системных функций, передачей адресов в функции, написанные на языках программирования более низкого уровня, например на ассемблере.
В программе на языке C++ бестиповый указатель может применяться там, где адрес интерпретируется по-разному, в зависимости от каких-либо динамически вычисляемых условий. Например, приведенная ниже функция будет печатать целое число, содержащееся в одном, двух или четырех байтах, расположенных по передаваемому адресу:
voidprintbytes(void* ptr, int nbytes){ if (nbytes == 1) { char* cptr = (char*)ptr; cout << *cptr; } else if (nbytes == 2) { short* sptr = (short*)ptr; cout << *sptr; } else if (nbytes == 4) { long* lptr = (long*)ptr; cout << *lptr; } else { cout << "Неверное значение аргумента"; }}
В примере используется операция явного преобразования типа. Имя типа, заключенное в круглые скобки, стоящее перед выражением, преобразует значение этого выражения к указанному типу. Разумеется, эта операция может применяться к любым указателям.