void (C++)
При использовании в качестве возвращаемого типа функции ключевое слово указывает, void что функция не возвращает значение. При использовании для списка параметров функции указывает, void что функция не принимает параметров. При использовании в объявлении указателя указывает, void что указатель является универсальным.
Если тип указателя равен void* , указатель может указывать на любую переменную, которая не объявлена с const помощью или volatile ключевое слово. void* Указатель не может быть разыменован, если только он не приведение к другому типу. void* Указатель можно преобразовать в любой другой тип указателя данных.
В C++ void указатель может указывать на бесплатную функцию (функцию, не являющуюся членом класса), или на статическую функцию-член, но не на нестатическую функцию-член.
Невозможно объявить переменную типа void .
В соответствии с стилем рекомендации по основной версии C++ не используются void для указания пустого списка формальных параметров. Дополнительные сведения см. в руководстве по C++ Core NL.25: не используйте void в качестве типа аргумента.
Пример
// void.cpp void return_nothing() < // A void function can have a return with no argument, // or no return statement. >void vobject; // C2182 void *pv; // okay int *pint; int i; int main() < pv = &i; // Cast is optional in C, required in C++ pint = (int *)pv; >
Справочник по C#. void
void можно использовать в качестве возвращаемого типа метода (или локальной функции) для определения того, что метод не возвращает значение.
public static void Display(IEnumerable numbers) < if (numbers is null) < return; >Console.WriteLine(string.Join(" ", numbers)); >
Вы также можете использовать void как ссылочный тип для объявления того, что тип указателя неизвестен. Дополнительные сведения см. в разделе Типы указателей.
Нельзя использовать void в качестве типа переменной.
См. также
- справочник по C#
- System.Void
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Указатели типа void*
В си существует особый тип указателей – указатели типа void или пустые указатели. Эти указатели используются в том случае, когда тип переменной не известен. Так как void не имеет типа, то к нему не применима операция разадресации (взятие содержимого) и адресная арифметика, так как неизвестно представление данных. Тем не менее, если мы работаем с указателем типа void, то нам доступны операции сравнения.
Если необходимо работать с пустым указателем, то сначала нужно явно привести тип. Например
#include #include int main()
Переменная не может иметь типа void, этот тип определён только для указателей. Пустые указатели нашли широкое применение при вызове функций. Можно написать функцию общего назначения, которая будет работать с любым типом. Например, напишем функцию swap, которая обменивает местами содержимое двух переменных. У этой функции будет три аргумента – указатели на переменные, которые необходимо обменять местами и их размер.
#include #include #include #include void swap(void *a, void *b, size_t size) < char* tmp; //создаём временную переменную для обмена tmp = (char*) malloc(size); memcpy(tmp, a, size); memcpy(a, b, size); memcpy(b, tmp, size); free(tmp); >int main()
Наша функция может выглядеть и по-другому. Обойдёмся без дорогостоящего выделения памяти и будем копировать побайтно.
void swap(void *a, void *b, size_t size) < char tmp; size_t i; for (i = 0; i < size; i++) < tmp = *((char*) b + i); *((char*) b + i) = *((char*) a + i); *((char*) a + i) = tmp; >>
Пустые указатели позволяют создавать функции, которые возвращают и принимают одинаковые параметры, но имеют разное название. Это пригодится в дальнейшем, при изучении указателей на функции. Например
int cmpInt(void* a, void* b) < return *((int*) a) - *((int*) b); >int cmpString(void *a, void* b) < return strcmp((char*) a, (char*) b); >int cmpFloat(void* a, void* b) < float fdiff = *((float*) a) - *((float*) b); if (fabs(fdiff) < 0.000001f) < return 0; >if (fdiff < 0) < return -1; >else < return 1; >>
ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev students
Всё ещё не понятно? – пиши вопросы на ящик
Тип void*
В языках C и C++ есть специальный тип данных void * . Это — «универсальный» указатель, который просто соответствует указателю на какой-либо адрес в памяти компьютера, безотносительно типа данных, на которые указывает этот указатель. То есть указатель типа void * нельзя разыменовать, так как разыменование — это доступ к переменной, которая хранится по адресу данного указателя.
Указатель типа void * используется для передачи параметром в функции и для возврата функциями значений, если функции работают с областями памяти, просто как с двоичными данными.
Примеры таких функций
Заголовочный файл
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.
Заголовочный файл
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 и free, а также calloc и realloc также работают с указателями типа void * .