![](/user_photo/2706_HbeT2.jpg)
- •Алфавит языка Си
- •Идентификаторы (имена) языка Си
- •Ключевые слова
- •Константы (литералы)
- •Комментарии
- •Пример программы на Си
- •Последовательность обработки программы на Си
- •Термины
- •2.1. Концепция типа данных
- •2.2. Базовые типы данных
- •2.2. Атрибуты объектов
- •2.2.1. Класс памяти
- •2.2.2. Область (сфера) действия, связанного с объектом идентификатора
- •2.2.3. Область видимости объекта
- •2.2.4. Продолжительность существования объекта (время жизни)
- •2.2.5. Тип компоновки (связывания)
- •2.3. Объявления, определения и описания в языке Си
- •2.4. Объявления переменных стандартных типов
- •2.5. Преобразования типов
- •Термины
- •3.1. Определение и общая классификация операторов
- •3.2. Последовательно выполняемые операторы
- •3.3. Операции языка Си
- •3.4. Приоритеты и порядок выполнения операций, тип результата выражения
- •Тип результата выражения арифметической бинарной операции
- •Даны X, y (значения вводятся с клавиатуры). Вычислить a, если
- •Термины
- •4.1. Условный оператор
- •4.2. Переключатель
- •4.3. Операторы циклов
- •4.4. Оператор безусловной передачи управления
- •4.5. Оператор возврата из функции
- •4.6. Оператор выхода из цикла или переключателя
- •4.7. Оператор перехода к следующей итерации цикла
- •Термины
- •5.1. Указатели
- •5.2. Ссылки
- •5.3. Массивы
- •5.3.1. Одномерные массивы
- •Int a[100]; // Объявление массива из 100 элементов типа int
- •Инициализация массива
- •Массивы и указатели
- •Динамические массивы
- •5.3.2. Многомерные массивы
- •Инициализация многомерных массивов
- •Динамические многомерные массивы
- •Указатель на массив указателей и указатель на массив
- •Int ** p1; // Указатель на массив указателей
- •Int (*p2)[10]; // Указатель на массив из 10 элементов типа int
- •Термины
- •6.1. Структуры
- •Int X; // Поле структуры
- •Int X; // Поле структуры
- •Int X; // Поле структуры
- •Инициализация структуры
- •Int year, page; // Год издания и число страниц
- •6.2. Объединения
- •6.3. Битовые поля структур и объединений
- •Int a1: 10; // Битовое поле из 10 бит
- •Int a2: 14; // Битовое поле из 14 бит
- •Int :6; // Пропускаем 6 бит
- •6.4. Директива определения типа typedef
- •Термины
- •7.1. Определение, описание и вызов функции
- •7.2. Использование значений параметров по умолчанию
- •7.3. Изменение значений скалярных параметров в функциях
- •7.3.1. Передача параметров в функции по значению
- •7.3.1. Передача параметров в функции по указателю (по ссылке)
- •7.4. Передача в функцию массивов
- •7.4.1. Передача в функцию массивов, не являющихся строками
- •7.4.2. Передача в функцию строк
- •7.5. Функции с переменным количеством параметров
- •7.6. Рекурсивные функции
- •7.7. Подставляемые (inline) функции
- •7.8. Указатели на функции
- •7.10. Шаблоны функций
- •7.11. Возможные параметры функции main
- •Термины
- •8.1. Общие сведения о вводе-выводе
- •8.2. Стандартные потоки ввода-вывода
- •8.3. Функции для вывода в поток stdout
- •8.4. Функции для считывания из потока stdin
- •8.5. Ввод- вывод в файлы Открытие файла
- •Закрытие файла
- •Определение конца файла
- •Функции записи в файл
- •Функции чтения из файла
- •Функции позицирования в файлах
- •Функции для сброса буферов
- •Термины
- •9.1. Стадии и основные команды препроцессорной обработки
- •9.2. Замены в тексте
- •9.3. Макроподстановки
- •9.4. Включение текстов из файлов
- •9.5. Условная компиляция
- •9.6. Директива нумерации строк
- •9.7. Директива обработки ошибок
- •9.8. Директивы # и ##
- •9.9. Заранее определенные препроцессорные идентификаторы
- •9.10. Указания компилятору
- •Термины
6.4. Директива определения типа typedef
Производный тип задается с помощью * [] struct union, иногда удобно производному типу присвоить одно простое имя, это можно сделать с помощью typedef. При этом после директивы typedef формат определения нового типа соответствует формату определения переменной данного типа, но введенное имя является не именем переменной, а именем нового типа.
Пример:
struct A { … };
A * m[10]; // Массив из 10 указателей на структуру A
Можно поступить по- другому:
typedef A *M[10]; // M – имя нового типа, задающего
// массив из 10 указателей на структуру A
M m; // Массив из 10 указателей на структуру A
Термины
Структура - это производный тип языка Си, включающий в себя множество элементов, элементы следуют в памяти друг за другом и могут быть разнотипными.
Объединение - это производный тип языка Си, включающий в себя множество элементов, элементы могут быть различных типов и располагаются в оперативной памяти, начиная с одного и того же адреса (т.е. элементы или поля накладываются друг на друга).
Битовое поле- это поле структуры или объединения, представляющее собой целое или беззнаковое целое значение (любые стандартные целые типы), занимающее в памяти фиксированное число битов (не более, чем соответствующий целый тип), размер битового поля задается в битах и не обязательно кратен целому числу байтов.
Лекция 7. Функции в Си (Си++)
Функция – это именованная совокупность объявлений и операторов, предназначенная для выполнения некоторой отдельной подзадачи.
Использование функции позволяет выполнять, так называемую функциональную декомпозицию задачи (предметной области). Большая сложная задача разбивается на относительно простые подзадачи и для решения каждой подзадачи разрабатывается функция. Функции можно отлаживать отдельно друг от друга.
Функция в Си основное понятие, любая выполняемая программа содержит, по крайней мере, одну функцию, так называемую главную функцию, с именем main (В Windows приложении эта функция имеет имя WinMain).
7.1. Определение, описание и вызов функции
Следует различать определение функции, описание функции (заголовок) и вызов функции.
Формат определения функции:
[<модификаторы>] <тип_возвращаемого_значения> <имя_функции>([<спецификация_формальных_параметров>])
{ <тело_функции> }
Спецификация формальных параметров в круглых скобках определяет параметры функции, один параметр отделяется от другого запятой. Спецификация формальных параметров имеет следующий формат:
<тип1> [<имя1>][=<умалчиваемое_значение>], <тип2> [<имя2>][=<умалчиваемое_значение>],…
Формальные параметры функции могут отсутствовать в этом случае после имени функции идут пустые скобки (или в скобках может быть ключевое слово void). Имя формального параметра может отсутствовать, если этот параметр пока не используется в теле функции, но зарезервирован на будущее.
Тело функции является блоком, в нем локализованы формальные параметры заголовка. Важным оператором тела функции является оператор return, наличие данного оператора обязательно, если тип возвращаемого значения отличен от void. Если функция возвращает некоторое значение, то она может вызываться внутри оператора- выражения в любом месте, где разрешено использовать значение данного типа.
В качестве модификаторов функции может присутствовать модификатор класса памяти extern или static. По умолчанию у функции класс памяти extern. Если функция определена с ключевым словом static, то функцию можно использовать только в том файле, где она определена.
Функция может быть определена только один раз, определение функции может находиться в отдельном файле, но чтобы ее использовать в другом файле (или в том же файле, но выше места определения) необходимо до вызова функции включить описание функции. Описание функции, по сути, является заголовком функции без тела, оно имеет формат:
[<модификаторы>] <тип_возвращаемого_значения> <имя_функции>
(<спецификация_формальных_параметров>);
Примечание. Стандартные заголовочные файлы stdio.h, stdlib.h, math.h и др. содержат описания или заголовки стандартных функций, поэтому их необходимо подключать, если требуется вызывать стандартные функции, описанные в заголовочных файлах.
Совокупность формальных параметров определяет сигнатуру функции. В описании имена параметров можно не использовать, важно количество и типы параметров. Также в описании не должны присутствовать умалчиваемые значения параметров, если они есть в определении функции.
Пример простой функции, которая возвращает сумму двух свои параметров:
double summa(double x, double y)
{
return x+y;
}
Описание или заголовок этой функции имеет вид:
double summa(double, double);
Вызов функции имеет следующий формат (вызов функции часто выполняется внутри оператора- выражения):
<имя_функции>(<список_факт_параметров>);
При вызове функции вместо формальных параметров подставляются фактические параметры (переменные, константы, указатели и др.) и выполняются операторы тела функции со значениями фактических параметров.
Следует отметить, что функция может вызываться «как функция», когда используется возвращаемое значение и функция вызывается внутри выражения:
S=summa(a, b); // Переменной S присваивается значение, возвращаемое функцией
Функция может вызываться «как процедура», когда возвращаемой значение не используется (если оно вообще не нужно, можно объявить тип void):
printf(“x=%f”, x); // Функция printf возвращает значение типа int, но оно не используется