В этой программе в вызове функции interchange(&x,&y) вместо передачи значений х и у мы
передаем их адреса. Это означает, что формальные аргументы и и v, имеющиеся в спецификации
interchanage(u,v), при обращении будут заменены адресами и, следовательно, они должны быть
описаны как указатели.
Поскольку х и у целого типа, u и v являются указателями на переменные целого типа, и мы
вводим следующее описание:
int *u,*v; int p;
Оператор описания используется с целью резервирования памяти. Мы хотим поместить
значение переменной х в переменную р, поэтому пишем: р=*u; Вспомните, что значение
переменной u - это &х, поэтому переменная и ссылается на х. Это означает, что операция *u дает
значение х, которое как раз нам и требуется. Мы не должны писать, например, так:
р = u; /* неправильно */
поскольку при этом происходит запоминание адреса переменной х, а не ее значения. Аналогично,
оператор *u = *v соответствует оператору х = у.
Тип функции определяется типом возвращаемого ею значения, а не типом ее аргументов.
Если указание типа отсутствует, то по умолчанию считается, что функция имеет тип int. Если
значения функции не принадлежат типу int, то необходимо указать ее тип в двух местах.
1. Описать тип функции в ее определении:
char pun(ch,n) /* функция возвращает символ */
int n;
char ch;
2. Описать тип функции также в вызывающей программе. Описание функции должно быть
проведено наряду с описаниями переменных программы; необходимо только указать скобки (но
не аргументы) для идентификации данного объекта как функции.
main()
{
char rch,pun();
6.6. КЛАССЫ ПАМЯТИ
Помимо изученных ранее характеристик переменных (имени, типа, значения), в ряде
случаев оказывается важной еще одна - класс памяти. Класс памяти характеризует время
существования и место хранения объекта в программе.
Для обозначения класса памяти в языке Си используются следующие служебные слова:
auto extern
register static
Автоматические объекты (auto) являются локальными по отношению к блоку и хранятся
внутри того блока, где они описаны. Автоматические переменные можно инициализировать
произвольными выражениями, включающими константы и ранее описанные переменные и
функции.
Автоматические объекты существуют только во время выполнения данного блока и теряют
свои значения при выходе из него. При каждом вхождении в блок им присваиваются начальные
значения, заданные в описании. Если начальные значения не заданы, то значения автоматических
объектов при входе в блок не определены. До сих пор в этом параграфе рассматривались именно
автоматические объекты.
Объекты, описанные внутри блока с классом памяти register, называются регистровыми