В последней записи скобки необходимы, поскольку если их не будет, увеличится значение самого указателя, а не то, на что он указывает. Это обусловлено тем, что унарные операторы * и ++ имеют одинаковый приоритет и порядок выполнения - справа налево.
И наконец, так как указатели сами являются переменными, в тексте они могут встречаться и без оператора косвенного доступа. Например, если
iq = ip;
копирует содержимое
5.2 Указатели и аргументы функций
Поскольку в Си функции в качестве своих аргументов получают значения параметров, нет прямой возможности, находясь в вызванной функции, изменить переменную вызывающей функции. В программе сортировки нам понадобилась функция
swap(a, b);
где функция
void swap(int х, int у) /* НЕВЕРНО */
{
int temp;
temp = х;
x = y;
у = temp;
}
Поскольку
swap(&a, &b);
Так как оператор & получает адрес переменной,
void swap(int *px, int *py) /* перестановка *px и *py */
{
int temp;
temp = *рх;
*рх = *py;
*ру = temp;
}
Графически это выглядит следующим образом: в вызывающей программе:
Аргументы-указатели позволяют функции осуществлять доступ к объектам вызвавшей ее программы и дают возможность изменить эти объекты. Рассмотрим, например, функцию
Одно из решений состоит в том, чтобы
int n, array[SIZE], getint (int *);
for (n = 0; n ‹ SIZE && getint (&array[n]) != EOF; n++)
;
Результат каждого очередного обращения к
В предлагаемом нами варианте функция
#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;
}
Везде в