Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры ТП!!.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
458.75 Кб
Скачать
  1. Описание, определение и вызов функций. Параметры по умолчанию. Встроенные функции.

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

void f(int a, int & b)

{a++;

b++;

}

В С принято передавать по значению переменные любых типов кроме массивов. Массивы передаются через указатели. Тип функции определяет формат возвращаемого значения; результат работы функции возвращается оператором return. Он обязателен для всех типов и может быть опущен только в функции типа void.

В С имеется возможность создавать и использовать функции с параметрами по умолчанию. В этом случае при вызове функции часть фактических параметров можно опустить. Значения параметров по умолчанию должны быть заданы в описании или определении функции.

int sum(int a, int b=10);

int c;

c=sum(15);

К моменту вызова функции с неполным списком аргументов, значение параметра по умолчанию должно быть уже определено.

Встроенные функции.

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

inline int sum(int a, int b)

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

  1. Особенности работы с указателями разных типов в языке с.

В простейшем случае ОП ЭВМ можно считать памятью с произвольной выборкой, т.е. в любой момент времени можно получить доступ к произвольной ячейке памяти. Для организации подобной адресации используются сегментированные адреса, т.е. полный адрес произвольной ячейки представляется совокупностью 2 частей: старшая – указатель на сегмент, младшая – смещение относительно заданного сегмента.

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

Для организации работы с сегментированными адресами в процессорах семейства Intel выделяют 4 сегментных регистра:

CS – сегмент кода. Используется для формирования адресов операторов программы.

DS – сегмент данных. Используется для формирования адресов статических данных.

SS – сегмент стека. Используется для вычисления адресов в стеке при передаче параметров между подпрог.

ES – расширенный сегмент. Используется для формирования адресов динамических данных.

В языке С++ для упорядоченной адресации используются указатели трех типов:

1) near – ближний указатель. Позволяет адресоваться к данным или осуществить вызов процедуры в пределах одного сегмента. В качестве адреса используется только 16-битное смещение. При формировании реального физического адреса система подставляет в качестве значения сегмента содержимое одного из сегментных регистров.

2) far – дальний указатель. Используется в случае, если данные или код выходят за пределы одного сегмента. Указатель типа far состоит из двух частей, определяющих адрес сегмента и смещение внутри сегмента. При работе с указателями типа far следует помнить о ряде правил обработки этих указателей компилятором:

1 операции на <, >, <=, >= используют при сравнении только 16-битное смещение

2 операции на =, <> работают с указателями типа far как с 32-битными целыми беззнаковыми числами

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

3) huge – нормализованный указатель. Позволяет адресовать каждую ячейку памяти только одним сегментированным адресом. Хранение в нормализованном виде предполагает, что значение сегмента максимально, а значение смещения колеблется от 0 до F. Это объясняется тем, что происходит выравнивание на границу параграфа. Все операции сравнения и арифметические операции выполняются корректно. При сравнении сравнивают сначала сегментную часть и потом, если необходимо, смещение. Выполняется контроль за переходом в пределах параграфа.

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