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

  Юрий  | 

  |

  Обновл. 13 Сен 2021  | 

 129212

 ǀ   9 

Указатель типа 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 (356 оценок, среднее: 4,95 из 5)
Загрузка...

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

  1. Arxangel:

    «Также нет такого понятия, как ссылка на void.»

    Что имеется ввиду?

    Разве это не ссылка на воид поинтер?

    1. Константин:

      читай по слогам: void* …- объявление указателя типа войд на что-то там…

  2. Анастасия:

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

    а не

    ?

    1. Anton:

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

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

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

  3. Ivan:

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

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

    1. somebox:

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

      1. Алексей:

        Это ведь массив. Ранее мы изучали указатели на массивы и тд и тп.

        Надо просто повторить.

        1. Алексей:

          Переменная array содержит адрес первого элемента массива, как если бы это был указатель! Например:

          Результат на моём компьютере:

          The array has address: 004BF968
          Element 0 has address: 004BF968

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

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