Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ekzamenYazyki_programmirovania.docx
Скачиваний:
15
Добавлен:
25.09.2019
Размер:
794.36 Кб
Скачать

13 Различия между аргументами и параметрами функции. Передача в функцию адресов переменных.

Формальными параметрами (аргументами) принято называть параметры, которые используются при описании функции. С их помощью определяется место в стэке, так называемом frame функции. На их основе описывается алгоритм обработки фактических параметров.

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

Передача в функцию адресов переменных

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

14 Идентификатор, объявленный как функция. Правила определения области видимости функции. Формат вызова функции.

Имя функции ( или идентификатор, объявляемый как функция) представляет указатель, значение которого является адресом функции, возвращающий значение определённого типа.

Адрес функции не изменяется во время выполнения программы, меняются только возвращаемые значения. Идентификаторы функций — константы, соответственно они не могут стоять в левой части операции присваивания, то есть они являются праводопустимыми выражениями.

Спецификатор класса памяти для функции необязателен, он задаёт класс памяти функции и может быть только static или extern, т.е функция всегда глобальн

Правила определения области видимости функции

Функция, объявляемая как static, видима в пределах того файла, в котором она определена. Любая функция может вызвать другую функцию с классом памяти static из этого же файла, но не может вызвать функцию, определённую с классом static в другом файле. Разные функции с классом памяти static, имеющие одинаковые имена, могут быть определены в разных исходных файлах, и это не ведёт к ошибке (конфликту).

Функция, объявленная с классом extern, видима в пределах всех исходных файлов программы. Любая функция может вызывать функции с классом памяти extern.

Если в объявлении отсутствует спецификатор класса памяти, то по умолчанию устанавливается класс extern. Все объекты с классом памяти extern компилятор помещает в объектном файле в специальную таблицу внешних ссылок, которые используются редактором связей для разрешения внешних ссылок. Часть внешних ссылок перёдается компилятором при обращении к библиотечным функциям C, поэтому для разрешения этих ссылок редактору связи должны быть доступны соответствующие библиотечные функции.

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

Вызов функции имеет следующую форму:

1)Любую ф-ю можно вызвать, указав её имя со списком фактических параметров.

имя_функции(параметр1, параметр2);

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

2)Функции можно использовать в выражениях. Так можно вызывать функции, которые возвращают значения НЕ void.

a=f(x)+f(x+y);

if(func(x)!=2){..}

При попытке использовать в выражении ф-ю, возвращающую void, компилятор выдаст ошибку.

15 Понятие указателя. Операции «*» и «&». Объявление указателя. Инициализация. Операции над указателями (присваивание, ссылка на значение, получение адреса, инкремирование, декремирование, вычисление смещения, сравнение).

Указатель – это переменная, которая содержит адрес памяти, т.е. сообщает о том, где размещён объект, и не говорит о самом объекте. Символ «*» используется для задания указателя на объект.

int* x; // x – указатель на целое

char *p, a='+';

p=&a; //адрес

printf("%c %c", a, *p); // *p - содержимое

Унарная операция * – обращение по адресу, т.е. раскрытие указателя или операция разадресации (доступ по адресу к значению того объекта, на который указывает операнд). Операндом должен быть указатель (*p, где p – указатель) (у этой операции ранг 2).

Объявление указателей

тип* имя_указателя;

Типом может быть любой из типов данных Си. Он изменяет тип переменной, на который указывает указатель. Указатель можно объявить вместе с переменными:

char *ch, c;

int *p,x,v;

Инициализация указателей

Использование неинициализированных указателей потенциально опасно, хотя и возможно. Пока указатель не содержит адреса переменной, он бесполезен. Адрес в указатель помещается с помощью операции взятии адреса – &.

Для обозначения указателя часто используют такие имена: pointer, ptr, p.

Указатель на тип void совместим с любым указателем:

void * y;

int *x;

x = y;

Пример.

main() {

int *x,*w,y,z;

*x = 16; // здесь допущена серьёзная ошибка, распространённая и опасная

y = –16;

w = &y;

}

По адресу, задаваемому в x, помещается значение 16. Ошибка – не инициализирован указатель. В 1 строке – компилятор резервирует память (*x, *w – под указатель, y, z – для переменных типа int).

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

В теради

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]