Неопределённые указатели — void *

Предыдущая  Содержание  Следующая V*D*V

Значение любого указателя может быть присвоено переменной указателя с типом void * и наоборот, за исключением имеющих классификаторы const. Эти присвоения не изменяют значение указателя. Фактически, это отключает проверку типов в компиляторе:

 

int iv [] = { 1, 2, 3 };

int * ip = iv;                    ок, тот же тип

void * vp = ip;                   ок, произвольный присваивается void *

double * dp = vp;                 ок, void * присваивается произвольному

 

В качестве спецификации формата для записи и чтения значений указателей для printf() и (теоретически) для scanf() используется %p. Подходящим типом аргумента является void * и, следовательно, любой тип указателя:

 

void * vp;

  printf("%p\n", vp);             выводит значение на экран

  scanf("%p", & vp);              читает значение

 

Арифметические операции включающие в себя void * не допускаются:

 

void * p, ** pp;

  p + 1                           ошибка

  pp + 1                          ок, указатель на указатель

 

Эту ситуацию иллюстрирует следующая картинка:

 

OOC_Generic_Pointers_-_void

 

Предыдущая  Содержание  Следующая