Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie_Shpory_moi.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

52 Операции typedef и sizeof

Операция typedef вводит новое имя (синоним) для существующего типа. С помощью typedef может быть объявлен любой тип, включая типы функции или массива. typedef double (* MATH)(); // MATH - новое имя типа, представляющее указатель на //функцию, возвращающую значения типа double MATH cos; // cos - это указатель на функцию, возвращающую значения типа double

Можно привести эквивалентное объявление - double (* cos)(); typedef char SIMB[40]; //SIMB - массив из сорока символов SIMB person; //переменная person - тоже массив из сорока символов

Это эквивалентно объявлению - char person; Помимо этого, имена типов могут использоваться еще и в списке формальных параметров (в объявлении функций), в операциях приведения типов и в операции sizeof.

typedef способен весьма облегчить нам жизнь. И не только нам...

typedef можно использовать, чтобы значительно упростить синтаксис сложных объявлений (воззаботимся же, братия, о тех бедных программистах, которые приИдут после нас). Используя typedef, можно сделать простым даже объявление стандартной функции set_new_handler:

typedef void (*new_handler)();

new_handler set_new_handler(new_handler);

Операция sizeof

Данная операция позволяет определить размер объекта по его идентификатору или типу, результатом является размер памяти в байтах (тип результата int). Формат записи:

sizeof (параметр); где параметр – тип или ID объекта (не ID функции).

Если указан идентификатор сложного объекта (массив, структура, объединение), то получаем размер всего сложного объекта. Например: sizeof(int) → размер памяти 2 байта,

int b[5]; sizeof(b) → размер памяти 10 байт. Наиболее часто операция sizeof применяется при динамическом распределении памяти.

53 Функции. Определение функции, объявление функции и вызов функции. Возвращаемое значение функции.

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

рые исходные данные и который (в случае необходимости) способен возвращать один или несколько результатов своей работы.

Декларация функции

Как объект языка Си, функцию необходимо объявить. Объявление функции пользователя, т.е. ее декларация, выполняется в двух формах – в форме описания и форме определения.

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

(полный ее текст): в текущем или другом файле исходного текста либо находится в библиотеке.

В стандарте языка используется следующий способ декларации функций:

тип_результата ID_функции(тип переменной 1,…, тип переменной N); Заметим, что идентификаторы переменных в круглых скобках прототипа указывать необязательно, так как компилятор языка их не обрабатывает. Описание прототипа дает возможность компилятору проверить соответствие типов и количества параметров при вызове этой функции.

Пример описания функции fun со списком параметров:

float fun(int, float, int, int);

Полное определение функции имеет следующий вид:

тип_результата ID_функции (список параметров) {

код функции

return выражение;

}

Тип результата определяет тип выражения, значение которого возвращается в точку ее вызова при помощи оператора return. Если тип функции не указан, то по умолчанию предполагается тип int.

Список параметров состоит из перечня типов и идентификаторов параметров, разделенных запятыми.

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

Если функция не возвращает значения, она описывается как функция типа void и в данном случае оператор return не ставится.

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

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

int min (int x, int y) {

return (x<y)? x : y;

}

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

такой функции желательно в круглых скобках также указать ключевое слово void. Например, void main(void).

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

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

Вызов функции

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

ID_функции (список аргументов);

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

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

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

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

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

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

ее адрес. А для обращения к значению аргумента-оригинала использовать операцию «*».

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