>swap(&a, &b);
Так как оператор & получает адрес переменной, &a есть указатель на a. В самой же функции swap параметры должны быть объявлены как указатели, при этом доступ к значениям параметров будет осуществляться косвенно.
>void swap(int *px, int *py) /* перестановка *px и *py */
>{
> int temp;
> temp = *рх;
> *рх = *py;
> *ру = temp;
>}
Графически это выглядит следующим образом: в вызывающей программе:
Аргументы-указатели позволяют функции осуществлять доступ к объектам вызвавшей ее программы и дают возможность изменить эти объекты. Рассмотрим, например, функцию getint, которая осуществляет ввод в свободном формате одного целого числа и его перевод из текстового представления в значение типа int. Функция getint должна возвращать значение полученного числа или сигнализировать значением EOF о конце файла, если входной поток исчерпан. Эти значения должны возвращаться по разным каналам, так как нельзя рассчитывать на то, что полученное в результате перевода число никогда не совпадет с EOF.
Одно из решений состоит в том, чтобы getint выдавала характеристику состояния файла (исчерпан или не исчерпан) в качестве результата, а значение самого числа помещала согласно указателю, переданному ей в виде аргумента. Похожая схема действует и в программе scanf, которую мы рассмотрим в параграфе 7.4. Показанный ниже цикл заполняет некоторый массив целыми числами, полученными с помощью getint.
>int n, array[SIZE], getint (int *);
>for (n = 0; n ‹ SIZE && getint (&array[n]) != EOF; n++)
> ;
Результат каждого очередного обращения к getint посылается в array[n], и n увеличивается на единицу. Заметим, и это существенно, что функции getint передается адрес элемента array[n]. Если этого не сделать, у getint не будет способа вернуть в вызывающую программу переведенное целое число.
В предлагаемом нами варианте функция getint возвращает EOF по концу файла; нуль, если следующие вводимые символы не представляют собою числа; и положительное значение, если введенные символы представляют собой число.
>#include ‹ctype.h›
>int getch (void);
>void ungetch (int);
>/* getint: читает следующее целое из ввода в *pn */
>int getint(int *pn)
>{
>int c, sign;
>while (isspace(c = getch()))
> ; /* пропуск символов-разделителей */
> if (!isdigit(c) && c != EOF && c != '+ '&& c != '-') {
> ungetch (c); /* не число */
> return 0;
> }
> sign = (c == '-') ? -1 : 1;
> if (с == '+' || с == '-')
> с = getch();
> for (*pn = 0; isdigit(c); c = getch())
> *pn = 10 * *pn + (c -'0');
> *pn *= sign;
> if (c != EOF)
> ungetch(c);
> return c;
>}
Везде в getint под *pn подразумевается обычная переменная типа