Вказівникам можна присвоювати адреси тільки тих даних, тип яких збігається з базовим типом вказівника. Виняток становлять спеціальні не типізовані вказівники, оголошені з ключовим словом void. Такі вказівники називають не типізованими, вони сумісні з усіма вказівниками програми і адресами усіх об’єктів.
При виконання операції звертання за адресою через не типізовані вказівники необхідно явно задавати тип значення, яке зберігається в пам'яті. Наприклад:
#include <iostream>
using namespace std;
int main() {
int a[ 5 ] = { 1, 2, 3, 4, 5 };
int * pi;
void * pv;
pi = & a[ 0 ];
pv = pi;
cout << *( int * )pv;
*(( int * ) pv + 1 ) = 23;
cout << a[ 1 ];
}
Операції перетворення до заданого типу і звертання за адресою мають однаковий пріоритет, виконуються справа наліво. Тобто, при обчисленні виразу *( int * )pv спочатку вказівник на void перетворюється в вказівник на int, після цього виконується звертання за отриманою адресою. Так само, при обчисленні виразу *(( int * ) pv + 1 ) спочатку вказівник на void перетворюється в вказівник на int, після цього значення вказівника збільшується на одиницю – тепер вказівник посилається на другий елемент масиву. Останньою виконується операція звертання за адресою, в цьому прикладі ми отримуємо адресу, по якій буде записано значення 23.