Язык программирования Си (Ритчи, Керниган) - страница 79

>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 подразумевается обычная переменная типа