- •Языки программирования. Классификация. Яп Си. Место Си в различных классификациях. Преимущества и недостатки.
- •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.
Va_start (ptr, последний_явный_параметр);
Дальше с помощью указателя ptr можно получить значение первого фактического параметра из списка переменной длины. Остаётся неизвестным тип этого параметра.
Этот тип необходимо каким-либо образом передать в функцию, используя явные параметры.
Определив тип очередного параметра, обращаемся к макросу va_arg(ptr, type), который вернёт значение искомого параметра.
24 Массивы и динамическая память. Функции malloc, calloc, realloc, free- прототипы и краткий анализ.
Массивы и динамическая память
Формирование массив с переменными размерами можно организовать с помощью указателей и средств для динамического выделения памяти.
Начнём рассмотрение указанных средств с библиотечных функций, которые описаны в файле stdlib.h
Функции, использующиеся для работы с динамической памятью
malloc()
calloc()
realloc()
malloc()- функция выделения динамической памяти, входящая в стандартную библиотеку языка Си.
Прототип:
void *malloc (size_t size);
size — размер распределяемой области памяти
принимает в качестве аргумента размер выделяемой области в байтах; возвращает нетипизированный указатель (void*) на область памяти заявленного размера или NULL в случае, если выделить память невозможно. Содержимое выделяемой области памяти не определено.
calloc() работает как и malloc(), но она так же предназначена для очищения памяти.
Прототип:
void *calloc (size_t num, size_t size);
num — количество распределяемых элементов
size — размер каждого элемента
calloc принимает в качестве аргумента количество элементов и размер каждого элемента в байтах; возвращает нетипизированный указатель (void*) на область памяти заявленного размера или NULL в случае, если выделить память невозможно. Значения элементов устанавливаются в ноль. malloc работает быстрее, чем calloc, в связи с отсутствием функции обнуления выделяемой памяти.
realloc() изменяет размер блока памяти, ранее созданного функцией malloc или calloc
Прототип:
void *realloc (void* ptr, size_t size);
ptr — указатель на исходный блок памяти
size — новый размер в байтах.
При вызове realloc возможен один из следующих исходов:
1) Если для расширения блока, находящегося по адресу ptr, имеется достаточно памяти, то происходит её выделение в нужном количистве и функция возвращает ptr.
2) Если памяти недостаточно для расширения по текущему адресу, создаётся новый блок размера size и имеющиеся данные копируются из старого блока в начало нового. Старый блок освобождается. Ф-я возвращает указатель на новый блок памяти.
3) Если ptr==null, то функция действует так же, как и malloc
4) Если аргумент size == 0, тогда блок памяти ptr освобождается, а функция возвращает NULL.
5) Если для перераспределения памяти недостаточно места: нельзя расширить старый блок или создать новый — функция возвращает NULL, а исходный блок остаётся неизменным.
Функция free() решает вопрос освобождения памяти, которая перед этим была выделена одной из трёх вышеприведённых функций. Сведения об этом участке памяти передаются в функцию free с помощью указателя – параметра типа void*.
Пример создания динамического массива
int i,n,m,**A; // ** - двумерный массив
scanf(“%d %d”,&n,&m);
A = int(**)malloc(n*sizeof(int*));
for(i=0;i<n;i++)
{
A[i] = (int*)malloc(m*sizeof(int));
}
va_end(ptr) предназначена для организации возврата из функции с переменным количеством параметров. Она должна быть вызвана после того, как будет обработан весь список параметров. Функция удаляет указатель для того, чтобы нельзя было использовать его повторно без вызова va_start().
