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

  Юрий  | 

    | 

  Обновл. 28 мая 2019  | 

 32097

 ǀ   5 

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

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

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

Результат выполнения программы выше:

7

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

Результат выполнения программы выше:

7
9.3
Jackie

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

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

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

Заключение

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

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

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

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

Тест


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

Ответ

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

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

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (84 оценок, среднее: 4,93 из 5)
Загрузка...

Комментариев: 5

  1. Аватар Анастасия:

    а я не поняла, почему со строковым типом данным работать на так, как с остальными? Почему

    а не

    ?

    1. Аватар Anton:

      Потому, что строка — это массив значений типа char, а массивы, как мы знаем, по умолчанию передаются по ссылке, поэтому указывать & нет необходимости.

      1. Аватар Анастасия:

        Спасибо за Ваш ответ! Понятно.

  2. Аватар Ivan:

    в последнем примере имеется ввиду вызов

    из примера выше?

    1. Аватар somebox:

      Я вот тоже с ходу не понял, что это за кусок кода.

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

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