Тип void*

В языках C и C++ есть специальный тип данных void *. Это - "универсальный" указатель, который просто соответствует указателю на какой-либо адрес в памяти компьютера, безотносительно типа данных, на которые указывает этот указатель. То есть указатель типа void * нельзя разыменовать, так как разыменование - это доступ к переменной, которая хранится по адресу данного указателя.

Указатель типа void * используется для передачи параметром в функции и для возврата функциями значений, если функции работают с областями памяти, просто как с двоичными данными.

Примеры таких функций

Заголовочный файл <string.h>

void *memset(void *s, int c, size_t n) - заполнить область памяти, на которую указывает s одинаковым значением байта c. Заполняется n байт памяти.

void *memcpy(void *dest, const void *src, size_t n) - скопировать n байт памяти из области памяти src в область памяти dst. Копируемые данные и область назначения данных не должны пересекаться.

void *memcpy(void *dest, const void *src, size_t n) - аналогично memcpy, но допускает пересечение областей, в этом случае для копирования используются вспомогательная память. Эта функция работает медленнее, чем memcpy.

Заголовочный файл <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) - из файла steam считываются данные блоками размером size, количество считываемых блоков равно nmemb. Данные записываются в область памяти, на которую указывает ptr. Функция возвращает количество успешно считанных блоков (то есть если все блоки были считаны успешно, то функция возвращает nmemb).

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) - записывает двоичные данные в файл. Параметры и возвращаемое значение аналогичны функции fread.

Заголовочный файл <malloc.h>

Функции динамического распределения памяти malloc и free, а также calloc и realloc также работают с указателями типа void *.