Урок 92. Указатели типа void

   ⁄ 

 Обновлено 31 Окт 2017

  ⁄   

Указатель типа void (или еще «общий указатель») — это специальный тип указателя, который может указывать на объекты любого типа данных! Объявляется он как обычный указатель, только вместо типа данных используется ключевое слово void:

Указатель типа void может указывать на объекты любого типа данных:

Однако, поскольку указатель void сам не знает, на объект какого типа он будет указывать, разыменовать его напрямую не получится! Вам сначала нужно будет явно преобразовать указатель типа void с помощью оператора cast в другой тип данных, затем уже разыменовывать.

Результат:

7

Следующий логичный вопрос: «Если указатель void сам не знает, на что он указывает, как тогда мы можем знать, в какой тип данных его следует явно конвертировать с помощью оператора cast?». Никак, это уже на ваше рассмотрение, вас самим придется отслеживать/угадывать нужный тип.

Например:

Результат:

7
9.3
Jackie

Еще немного об указателях типа void

Указателям void можно задать нулевое значение:

Хотя некоторые компиляторы позволяют удалять указатели void, которые указывают на динамически выделенную память, делать этого не следует, так как результаты могут быть неожиданными.

Также не получится выполнить адресную арифметику с указателями типа void. Так как для этого требуется, чтобы указатель знал размер объекта, на который он указывает (для выполнения корректного инкремента или декремента).

Также нет такого понятия, как ссылка на void. Так как тогда бы ссылка на void была бы типа void &, и не было бы известно, на значение какого типа она ссылается.

Итого

В общем, использовать указатели void не рекомендуется, разве что в крайних случаях, когда это абсолютно необходимо, так как с их использованием проверку типов данных ни вам, ни компилятору выполнить не удастся. А это в свою очередь позволит вам случайно делать то, что не имеет смысла, и компилятор на это жаловаться не будет. Например:

Здесь компилятор промолчит. Но что будет в результате? Кто знает!

Хотя код выше кажется аккуратным способом заставить одну функцию обрабатывать несколько типов данных, в C++ на самом деле есть гораздо лучший способ сделать то же самое (через перегрузку функций), в котором сохраняется проверка типов для предотвращения неправильного использования. Также для обработки нескольких типов данных можно использовать шаблоны, которые также обеспечивают хорошую проверку типов. Но об этом уже в следующих уроках.

Если вам все же придется использовать указатель типа void — убедитесь, что нет лучшего (более безопасного) способа сделать то же самое, но с использованием других механизмов C++!

Тест

В чем разница между нулевым указателем и указателем типа void?

Ответ

Указатель типа void — это указатель, который может указывать на объект любого типа данных, но он сам не знает, какой это будет тип. Для разыменования указатель типа void должен быть явно преобразован с помощью оператора cast в другой тип данных. Нулевой указатель — это указатель, который не указывает на адрес. Указатель void может быть нулевым указателем.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (2 оценок, среднее: 4,50 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *