Материал: Информатика Лекции 27.03.02

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

вернуться только значение переменной, упомянутой в операторе return. И тип именно этой переменной и является типом возвращаемого значения, который указывается в заголовке функции.

Если из одной функции в другую в качестве параметра передаётся массив, то механизм передачи другой. В функцию передаётся адрес нулевого элемента массива, и она фактически получает доступ ко всем элементам массива. Копирование элементов в этом случае не производится.

void main()

void funk(int t[100])

{int a[100];

{ . . .}

. . .

 

funk(a); . . .}

Такая передача называется передачей по адресу, и таким образом можно передавать не только массивы, но и простые переменные. Передача переменных по адресу используется, в частности, для того, чтобы позволять функции менять значения более чем одной переменной, переданной из другой функции, и неявно возвращать эти изменённые значения в вызвавшую функцию.

void main(void)

{int a,b;

. . .

top(&a,&b);

. . .

}

void top (int *w, int *e) { int c;

c=*w; *w= *e; *e=c;

}

Стандарт языка С разрешает не указывать в заголовке функции тип возвращаемого значения только в том случае, если этот тип – целый. Во всех остальных функциях необходимо явное указание типа возвращаемого значения. Кроме этого, все такие функции нуждаются в дополнительном описании, которое называется прототипом и имеет вид:

тип возвращаемого значения ИМЯ(); или тип возвращаемого значения ИМЯ(список типов параметров);

Прототип можно не указывать, если заголовок функции оказывается в программном коде раньше её первого вызова. Если всё-таки приходиться писать прототипы, то их часто указывают один раз перед самой первой функцией в файле. Однако для документирования программ и с целью возможности использования

Информатика 27.03.02

56

функций в разных проектах иногда советуют дополнительно описывать каждую функцию в каждой вызывающей функции.

С целью полного соответствия программы требованиям стандарта для функций, не имеющих аргументов на входе, принято в круглых скобках после имени в заголовке указывать ключевое слово void.

void main(void)

Область действия переменных. Классы памяти.

Все переменные, которые описаны внутри каких-либо фигурных скобок, являются локальными, что означает ограничение области действия переменных той функцией или тем блоком, в котором они описаны. При временном выходе из функции такая переменная недоступна, но её значение не теряется. При окончании работы функции переменная прекращает своё существование. Для описания таких локальных переменных может дополнительно использоваться ключевое слово auto, и, соответственно, такие переменные называются автоматическими.

void main(void) {int x=1;

{int x=7; printf(“%d\n”,x--);

}

printf(“%d\n”,++x);

}

Вообще, в С существуют четыре класса памяти (класса переменных) – автоматические, регистровые (являются разновидность автоматических), статические и внешние. Глобальную область действия имеют только внешние переменные, все остальные

являются локальными.

 

 

 

Регистровые переменные хранятся

не в

оперативной

памяти, а

в регистрах процессора, благодаря

чему

программа,

возможно,

будет работать быстрее. Таким переменными можно назначать только автоматические переменные или формальные параметры функций. При их описании перед типом указывается ключевое слово register.

Компилятор может не выделить регистр для такой переменной, но, независимо от того, выделялся на самом деле регистр или нет, для таких переменных не определено понятие адреса.

Статические переменные, подобно автоматическим, локальны в той функции или в том блоке, в которых они описаны. Разница заключается в том, что значения статических переменных не теряются, когда выполнение функции (но не всей программы) завершается. Если управление вновь будет передано в данную функцию, то выяснится, что статические переменные имеют именно

Информатика 27.03.02

57

те значения, с которыми они остались после предыдущего вызова подпрограммы.

void main(void) {kirpich();

kirpich();

}

void kirpich(void)

{static int x; x+=3;

printf(“%d\n”;x);

}

Если переменная описана как статическая, то начальное значение присваивается ей только один раз – перед началом работы программы. При вызовах функции инициализации не происходит. При этом автоматические переменные получают начальные значения по ходу выполнения программы. Если значение статической переменной не присвоено явно, то она полагается равной нулю.

Внешние переменные отличаются от всех ранее рассмотренных классов памяти тем, что имеют глобальную область действия. Они существуют вне отдельных функций и доступны любой функции программы, которая захочет к ним обратиться. Фактически, внешние переменные неявно передаются между функциями, и их значения меняются в процессе использования в любой из этих функций.

По умолчанию внешние переменные получают начальные значения равные нулю.

Внешние переменные в обязательном порядке описываются вне

функций,

а

кроме того должны

дополнительно описываться в

функции,

которая

намеревается

их

использовать, если только они

не описаны

выше

этой функции

в

том же самом программно файле.

Для такого дополнительного описания внешних переменных внутри функций используется ключевое слово extern.

int x;

void main(void)

{printf(“x=%d\n”,x); gnus();

giena();

}

void gnus(void) {extern int y;

x=x+7; y=y-8;

printf(“x=%d\n”,x);

}

int y=11;

Информатика 27.03.02

58

void giena(void) {x=x-3;

printf(“x=%d\n”,x);

}

Информатика 27.03.02

59