Эта функция не производит никаких действий над фактическими параметрами, так как будут обмениваться значениями только формальные параметры: с чем пришел – с тем и ушел. Перепишем ее следующим образом:
void swap(int *a, int *b) // используем значения переменных
{ // по адресам переменных a и b
int temp;
temp=*a; // алгоритм циклического обмена
*a=*b; // значениями, находящимися
*b=temp; // по этим адресам
}
Эта функция использует не формальные параметры, а значения, находящиеся по адресам формальных параметров. Сами адреса переменных функцией не изменяются, как это и положено формальным параметрам. Меняются только значения, находящиеся по данным адресам, а эти значения не являются формальными параметрами. Хитро придумано!
Обратимся к этой функции, например, из головной программы:
В этом случае переменные x и y обменяются своими значениями.
Если в качестве формальных параметров используются имена массивов (строк), то в списке фактических параметров перед ними знаки амперсанда &не ставятся: имя массива в Си является адресом его первого элемента. Поэтому в функцию передается не массив со всеми значениями его элементов, а только адрес его первого элемента. Адреса всех остальных элементов вычисляются автоматически:
void poplavok(int n, int vector[n])
{
int top, bottom, temp;
for (top=0, bottom = n-1; top<bottom; top++, bottom--)
{
temp = vector[top];
vector[top] = vector[bottom];
vector[bottom] = temp;
}
}
Эта функция переворачивает вектор vector[n] – выполняет «поплавок».
Более того, при передаче в функцию вектора можно не указывать его длину, оставляя квадратные скобки за его именем пустыми:
void poplavok(int n, int vector[])
Обратимся к этой функции из головной программы:
#include <stdio.h>
#include <conio.h>
void poplavok(int n, int vector[]); // прототип функции