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; >
Как вывести void в c
Функция может возвращать указатель на другую функцию. Это может быть актуально, если имеется ограниченное количество вариантов — выполняемых функций, и надо выбрать одну из них. Но при этом набор вариантов и выбор из них определяется в промежуточной функции.
Рассмотрим простейший пример:
#include void goodmorning(); void goodevening(); void(*message(unsigned))(); int main() < void(*action)(); // указатель на выбранную функцию // выполняем полученную функцию action(); // Good Morning! action = message(16); // получаем новую функцию action(); // Good Evening! > void(*message(unsigned hour))() < if (hour >15) return goodevening; else return goodmorning; > void goodmorning() < std::cout void goodevening()
Здесь определена функция message, которая в зависимости от переданного числа возвращает одну из двух функций goodmorning или goodevening. Рассмотрим объявление функции message:
void(*message(unsigned hour))()
Вначале указан тип, который возвращается функцией, которая возвращается из message, то есть тип void (функции goodmorning и goodevening имеют тип void). Далее идет в скобках имя функции со списком параметров, то есть функция message принимает один параметр типа unsigned int : (*message(unsigned hour)) . После этого отдельно в скобках идет спецификация параметров функции, которая будет возвращаться из message. Поскольку функции goodmorning и goodevening не принимают никаких параметров, то указываются пустые скобки.
Имя функции фактически представляет указатель на нее, поэтому в функции message мы можем возвратить нужную функцию, указав после оператора return ее имя.
Для получения указателя на функцию определяем переменную action:
void(*action)();
Эта переменная представляет указатель на функцию, которая не принимает параметров и имеет в качестве возвращаемого типа тип void, то есть она соответствует функциям goodmorning и goodevening.
Затем вызываем функцию message и получаем указатель на функцию в переменную action:
action = message(16);
Далее, используя указатель action, вызываем полученную функцию:
action();
Поскольку в функцию message передается число 16, то она будет возвращать указатель на функцию goodevening, поэтому при ее вызове на консоль будет выведено сообщение «Good Evening!»
Рассмотрим более сложный пример, в котором в зависимости от выбора пользователя выполняется та или иная арифметическая операция над двумя числами:
#include int add(int, int); int subtract(int, int); int multiply(int, int); int(*select(int))(int, int); int main() < int(*action)(int, int) ; // получаем указатель на функцию add std::cout int(*select(int choice))(int, int) < // возвращаем нужную функцию в зависимости от choice switch (choice) < case 2: return subtract; case 3: return multiply; default: return add; >> int add(int x, int y) < return x + y; >int subtract(int x, int y) < return x - y; >int multiply(int x, int y)
В данной программе мы предполагаем, что пользователь должен выбрать для выполнения одну из трех функций: add, subtract, multiply. И выбранная функция будет выполнять определенное действие над двумя числами x и y.
Сам выбор происходит в функции select() . Она получает условный номер функции и возвращает указатель на функцию — по сути выбранную функцию.
Все выбираемые функции имеют прототип вида:
int add(int, int);
И прототип функции select должен соответствовать этому прототипу:
int (*select(int))(int, int)
То есть в начале идет тип — возвращаемый тип указателя на функцию, то есть int. Затем идет определение самой функции select — ее название со списком параметров помещается в скобках — (*select(int)) . Затем идет спецификация параметров функции, на которую определяется указатель. Так как функции add, subtract и multiply принимают два значения типа int, то соответственно спецификация параметров выглядит следующим образом (int, int) .
Для выбора нужной функции в select применяется конструкция switch-case:
int(*select(int choice))(int, int) < // возвращаем нужную функцию в зависимости от choice switch (choice) < case 2: return subtract; case 3: return multiply; default: return add; >>
В функции main() вызываем функцию select, передавая в нее определенное число и получая в качестве результата указатель на функцию:
int(*action)(int, int) ; // получаем указатель на функцию add
После этого мы сможем вызвать функцию по указателю. Поскольку функция по указателю должна принимать два значения типа int, то мы их можем передать в вызываемую функцию и получить ее результат:
std::coutВ примере выше сделано довольно просто - какое-бы число не будет передано в функцию select, она всегда возвратит указатель на некоторую функцию. Однако мы можем ограничить выбор:
#include int add(int, int); int subtract(int, int); int multiply(int, int); int(*select(int))(int, int); int main() < int(*action)(int, int) ; // получаем указатель на функцию if(action) // если не равно nullptr < std::cout else < std::cout > int(*select(int choice))(int, int) < int (*actions[])(int x, int y)< add, subtract, multiply >; // возвращаем нужную функцию в зависимости от choice // возвращаем нужную функцию if (choice >0 && choice <4) return actions[choice - 1]; else return nullptr; >int add(int x, int y) < return x + y; >int subtract(int x, int y) int multiply(int x, int y)В данном случае все доступные для выбора функции хранятся в массиве actions, который представляет массив указателей на функции. Если передан номер 1, 2 или 3, то возвращаем из этого массива определенную функцию. Если переданный номер функции представляет другое число, то возвращаем значение nullptr :
if (choice >0 && choice<4) return actions[choice - 1]; else return nullptr;Поскольку возвращается nullptr, то перед выполнением полученной функции указатель надо проверить на nullptr:
int(*action)(int, int) ; // получаем указатель на функцию if(action) // если не равно nullptr < std::cout else
Указатели типа 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
Всё ещё не понятно? – пиши вопросы на ящик
Вывод из функции в c++
Всем здравствуйте, следующая проблема: У меня есть функция "showArray" она выводит случайные числа, я в "main" приписываю её, а как мне теперь увидеть сгенерированные числа? В main прописываю : cout
#include #include #include using namespace std ; void generateArray(int *arr,int n); void showArray(int *arr,int n); int searchMin(int *arr,int n); int searchMax(int *arr,int n); void echangeMinMax(int *arr,int index_of_min,int index_of_max); void sortUpArray(int *arr,int n); void deleteEvenElements(int *arr,int &n); void moveLeftElements(int *arr,int n); int main() < int n; cin>> n; int *arr=new int[n]; generateArray(arr,n) ; showArray(arr,n); int index_of_min=searchMin(arr,n); cout void generateArray(int *arr,int n) < int a,b; cin>> a; cin>> b; srand(time(NULL)); for (int i=0;i
void showArray(int *arr,int n) < for (int i=0;i int searchMin(int *arr,int n) < int index_of_min=0; for (int i=1;i > return index_of_min; > int searchMax(int *arr,int n) < int index_of_max=0; for (int i=1;i arr[index_of_max]) < index_of_max= i; >> return index_of_max; > void echangeMinMax(int *arr,int index_of_min,int index_of_max) < swap(arr[index_of_min],arr[index_of_max]); >void sortUpArray(int *arr,int n); < for (int i=0;i arr[i]) < swap (arr [i],arr[i]); >> Отслеживать
задан 14 ноя 2017 в 14:08
149 1 1 золотой знак 5 5 серебряных знаков 17 17 бронзовых знаков
Вы пишете именно cout << showArray ? (тем самым выводите адрес функции showArray) 14 ноя 2017 в 14:141 ответ 1
Сортировка: Сброс на вариант по умолчанию
int main() < int n; cin>> n;
int *arr=new int[n]; generateArray(arr,n) ;
Ввели числа a и b и заполнили массив.
showArray(arr,n);
Вывели массив на экран.
int index_of_min=searchMin(arr,n); cout
Нашли и вывели индекс минимального значения
int index_of_max=searchMax(arr,n); cout
echangeMinMax(arr,index_of_min, index_of_max);
showArray(arr,n);
Опять вывели массив
Что вы еще хотите?
Еще раз его вывести? просто пишите, как и ранее -
showArray(arr,n);