Два результата сразу
Через return функция возвращает только одно значение. Но у некоторых вычислений два результата. Например, 135 минут — это 2 часа и 15 минут: два числа. С помощью указателей функция может записать сколько угодно результатов в переменные вызывающей стороны:
#include <stdio.h>
void split_time(int total_minutes, int *hours, int *minutes) {
*hours = total_minutes / 60;
*minutes = total_minutes % 60;
}
int main(void) {
int hours = 0;
int minutes = 0;
split_time(135, &hours, &minutes);
printf("%d ч %d мин\n", hours, minutes);
return 0;
}Программа выведет:
2 ч 15 минПервый параметр функция только читает, поэтому это обычный int, и ему можно передать число. В два других она записывает, поэтому они указатели, и им нужно передавать адреса переменных. Такие параметры называются выходными параметрами: функция их не читает, а заполняет. Звёздочки в первой строке функции показывают, какие параметры — результаты.
Переменные hours и minutes должны существовать до вызова. Здесь они начинают с 0, и функция перезаписывает их. Если вызвать функцию ещё раз с теми же переменными, она перезапишет их снова. И, как обычно, если забыть & в вызове, компиляция закончится ошибкой, в которой сказано take the address with &.
Задание
- 1
Вместо комментария напишите функцию
shareс четырьмя параметрами:candiesиchildrenтипаint, которые она только читает, и указателямиeachиleft_overтипаint *, куда она записывает результаты. Функция делит конфеты между детьми: каждый ребёнок получаетcandies / childrenконфет, аcandies % childrenконфет остаются. - 2
В
mainнижеprintfсоздайте переменныеeachиleft_overсо значением0. Вызовитеshareсcandies,childrenи адресами двух новых переменных. Затем выведитеКаждому: 3, осталось: 2, подставив оба числа через%d. - 3
Приходит ещё один ребёнок. Ниже последнего
printfприбавьте 1 кchildren, снова вызовитеshareс теми же переменными и выведите результат тем же способом. Программа выведетКаждому: 2, осталось: 5.