Обмен двух переменных
Обмен значений двух переменных — частая задача в программировании, например при сортировке. В main, без функции, поначалу всё выглядит просто:
int a = 3;
int b = 8;
a = b;
b = a;
printf("%d %d\n", a, b);Программа выведет:
8 8Строка a = b; затёрла прежнее значение a, тройку, и оно потерялось. Это как поменять напитки в двух полных стаканах: нужен третий, пустой стакан. В программе такой стакан — вспомогательная переменная, в которой вы сначала сохраняете прежнее значение a:
int a = 3;
int b = 8;
int temp = a;
a = b;
b = temp;
printf("%d %d\n", a, b);Программа выведет:
8 3Функция swap должна изменить две переменные вызывающей стороны, поэтому оба параметра должны быть указателями: void swap(int *a, int *b). Внутри она делает те же три шага, что и выше, только с *a и *b вместо a и b. Вспомогательная переменная temp остаётся обычным int, потому что в ней лежит значение, а не адрес. В вызов передаются два адреса: swap(&x, &y);.
Остерегайтесь таких ошибок:
- Если забыть звёздочки (
int *temp = a; a = b; b = temp;), функция поменяет местами два указателя, свои собственные копии адресов. Программа скомпилируется и запустится, но переменные вmainостанутся прежними. - Функция, у которой уже есть указатели, передаёт их дальше без
&. Внутри функции с параметрамиint *aиint *bвы вызываетеswap(a, b), потому чтоaиbуже являются адресами.swap(&a, &b)заканчивается ошибкойincompatible pointer types passing 'int **' to parameter of type 'int *'; remove &.int **— адрес указателя, а он здесь не нужен; сообщение подсказывает, что делать: уберите&.
Задание
- 1
Вместо первого комментария напишите функцию
swapс двумя параметрами типаint *,aиb, которая меняет местами значения, на которые они указывают. - 2
В
mainвместо комментария между первыми двумя строкамиprintfвызовитеswapс адресамиfirstиsecond. Программа выведет3 8, а затем8 3. - 3
Вместо второго комментария напишите функцию
sort_pair, которая тоже получает два указателя наint. Если первый указывает на число больше, чем второй, она вызываетswap, чтобы поменять их местами, и меньшее число всегда оказывается первым. Затем вместо последнего комментария вызовитеsort_pairс адресамиxиy. Последняя строка вывода тогда будет4 9.