- •Языки программирования. Классификация. Яп Си. Место Си в различных классификациях. Преимущества и недостатки.
- •2 Базовые конструкции яп. 3 вида констант *целочисленные, действительные, строковые). Правило составления идентификатора. Зарезервированные слова.
- •Константы
- •3 Общая структура программы на Си. Понятие функции. Функция main. Лексема.
- •Int main() // главная функция
- •5. Схема создания исполняемой программы
- •6. Понятие типа данных. Базовые типы данных языка Си и их характеристика.
- •7. Размещение программы в памяти. 4 цели использования памяти. 6 моделей памяти
- •8 Понятие переменной и 3 ее характеристики. Статические и динамические переменные. Операция присваивания.. Область действия переменной.
- •10 Внешняя память. Понятие глобальной и локальной переменной. Объявление с различными классами памяти.
- •11 Функции. Определение. Имя функции. Независимость. Возвращаемое значение. Прототип. Синтаксис прототипа функции. Оператор return.
- •Int func(int, double, int); // описание прототипа функции
- •12 Структурное программирование. Преимущества структурного программирования. Обработка вызова функции.
- •13 Различия между аргументами и параметрами функции. Передача в функцию адресов переменных.
- •14 Идентификатор, объявленный как функция. Правила определения области видимости функции. Формат вызова функции.
- •16 Понятие массива. Объявление массива. Случаи, в которых константное выражение может быть опущено. Сечение массива.
- •17 Пример объявления символьного массива. Вычисление адреса элемента массива. Связь между массивами и указателями.
- •19 Массивы указателей типа char(указатели и строки). Инициализация символьных массивов. Действия оператора «*».
- •20 Указатели на функцию. Объявление. Инициализация и использование указателя на функцию.
- •21 Передача указателя как аргумента в функцию. Встраиваемые функции. Ключевое слово inline.
- •22 Передача массивов в функцию (2 способа).
- •23 Функции с переменным числом параметров. Подключение stdarg.H. Средства работы и макросы
- •Va_start (ptr, последний_явный_параметр);
- •24 Массивы и динамическая память. Функции malloc, calloc, realloc, free- прототипы и краткий анализ.
- •25 Структуры. Понятие. Объявление. Определение. Обращение к полям структуры.
- •26 Сложные структуры. Структуры, содержащие массивы
- •28 Структуры и указатели. Указатели, как поля структур. Создание указателей на структуры. Указатели и массивы структур. Передача структур в функции.
- •29 Объединения. Определение. Создание. Инициализация. Обращение к отдельным объектам объединения. Создание структурных типов с помощью спецификатора typedef.
- •30 Создание динамически связанных структурных типов. Линейный список. Двусвязный список.
- •31 Потоки ввода-вывода. Понятие потока. Текстовые и двоичные потоки. Стандартные потоки.
- •32 Файлы. Имена файлов. Открытие файла. Ситуации, считающиеся ошибочными, в результате которых функция возвращает значение 0.
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).
Для выделения памяти существуют специальные функции, с помощью которых запрашивается и выделяется память из кучи.
В теради