Урок №96. Вказівники типу void

  Юрій  | 

  Оновл. 13 Січ 2021  | 

 81

Вказівник типу 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 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

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