Информатика и технология программирования

         

Указатель типа void*


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

Именно такими свойствами обладает указатель типа void* -указатель на пустой тип void . Наличие его в данном месте программы говорит о том, что она не имеет достаточных оснований для работы с адресуемой областью памяти. Наиболее часто тип void* является формальным параметром или результатом функции. Приведем несколько примеров:


extern void *malloc(int);
int *p;
p = ( int*)malloc(sizeof(int)*20);
p[i] = i;

Функция malloc возвращает адрес зарезервированной области динамической памяти в виде указателя void*. Это означает, что функцией выделяется память как таковая, безотносительно к размещаемым в ней переменным. Вызывающая функция неявно преобразует тип указателя void* в требуемый тип int* для работы с этой областью как с массивом целых переменных.


extern int fread(void *, int, int, FILE *);
int A[20];
fread( (void*)A, sizeof(int), 20, fd);

Функция fread выполняет чтение из двоичного файла n записей длиной по m байтов, при этом структура записи для функции неизвестна. Поэтому начальный адрес области памяти передается формальным параметром типа void*. При подстановке фактического параметра A типа int* производится неявное преобразование его к типу void*.

Как видно из примеров, преобразование типа указателя void* к любому другому типу указателя соответствует " смене точки зрения" программы на адресуемую память от " данные вообще" к " конкретные данные" и наоборот.



Содержание раздела