- •Динамическое распределение памяти Статическое выделение памяти
- •Динамическое выделение памяти
- •Библиотека c для управления динамическим выделением памяти
- •Изменение размеров выделенного блока
- •Агрегатные типы данных
- •Объявление структур
- •Определение и инициализация переменных
- •Инициализация
- •Доступ к полям структуры
- •Функции и структуры
- •Создание синонимов для структурных типов
- •Файловый ввод и вывод
- •Открытие файла
- •Функции для ввода вывода в поток
- •Управление просмотром файлов
- •Функции с переменным числом аргументов
- •Реализация функций с переменным числом аргументов
- •Особенности вызова функции в си
- •Объектно-ориентированное программирование
- •1) Абстрагирование
- •2) Декомпозиция
- •3)Инкапсуляция
- •Наследование
- •Расширение понятия структура
- •Использование ссылок в аргументах функции
- •Функции, возвращающие ссылки
- •Проблема инициализации
- •Объявление и определение классов
- •Конструкторы и деструкторы
- •Варианты синтаксиса инициализации объектов
- •Статические члены-данные
- •Неявный указатель this
- •Статические методы классов
- •Конструктор копирования
- •Друзья класса
- •Область видимости в классе
- •Уточнение концепции ограничения доступа
- •Наследование
- •Конструкторы и деструкторы производных классов
Определение и инициализация переменных
Есть несколько методов описания переменных структурного типа:
1) struct complex {
float real;
float imagine; };
Для определения переменных можно использовать имя структурного типа. Можно совместить объявление структурного типа с определением переменных:
struct complex {
float real;
float imagine;
} z, *pz, az[10];
В тех случаях, когда переменные структурного типа нужно определить только в одном месте, можно использовать объявление анонимной структуры. В этом случае, должны быть обязательно определены переменные структурного типа, иначе объявление будет бесполезным.
Инициализация
На инициализацию структурных переменных распространяются многие правила обычной инициализации. Например: структурные переменные, объявленные на глобальном уровне или как статические, по умолчанию обнуляются. Явная инициализация может быть полной или неполной, структурированной и неструктурированной.
struct complex z1={1.2, 3.4}, z2={-5.8};
В случае неполной инициализации оставшиеся поля остаются неинициализированными.
struct complex z[2]={1.2, 3.4, -5.8};
z[0]. real <- 1.2
z[0].imagine <-3.4
структурированная: struct complex z[2]={1.2, 3.4, -5.8};
struct complexz[2]={ {1.2}, {3.4, -5.8}};
Доступ к полям структуры
Поля структуры можно рассматривать как отдельные переменные, которыми можно пользоваться в программе. Поэтому нужно уметь обращаться к отдельным полям. Основной операцией для обращения к полям структуры является точка.
struct complex z={0.3, 2.1};
printf("real=%f\n imagine=%f", z.real, z.imagine);
имеется возможность определять указатели на переменные структурного типа.
struct complex z={0.3, 2.1}, *pz=&z;
Операция точка позволяет обратиться к полям через объект (*pz).real, (*pz).imagine
Если есть указатель, то объект можно получить разыменованием и затем использовать точку. Чтобы упростить синтаксис, в C имеется операция стрелка, которая позволяет обращаться к полям прямо через указатель: pz--> real, pz--> imagine.
Функции и структуры
Структурные типы могут использоваться как для описания формальных параметров функции, так и для ее возвращаемого значения. Правила передачи структурных переменных в функции обычные для C. Структуры передаются значением, т.е при вызове функции значения фактического параметра копируются в аргумент функции. Если структурный тип объемный, то эта операция потребует памяти и времени. Поэтому, часто структуры передаются в функции с помощью указателей. В этом случае, внутри функции мы будем работать со структурой являющейся фактическим аргументом.
Примеры:
1) передача значением:
struct complex {
float re;
im;};
Определим функцию add, которая выполняет сложение двух комплексных переменных и возвращает результат сложения.
struct complex add( struct complex z1, struct complex z2) {
struct complex z;
z.re=z1.re+z2.re;
z.im=z1.im+z2.im;
return z;
}
struct complex a, b1={1.2}, b2={3.4};
a=add(b1,b2);
При вызове функции значение b1 копируется в z1, b2 в z2.
Этот пример показывает, что переменным структурного типа можно присваивать значения структурного типа или просто переменные структурного типа.
2) передача в функцию по ссылке
struct complex add1 ( struct complex *pz1, struct coplex *pz2) {
struct complex z;
z.re=pz1-->re+pz2-->re;
z.im=pz1-->+pz2--im;
return z;
}
вызов будет таким:
a=add1(&b1,&b2);
В этом случае, при вызове функции в аргументы pz1 и pz2 копируются адреса структур, b1 и b2. А внутри функции мы работаем с оригиналами этих структур.
3) функция add2 получает три аргумента: два указателя на слагаемые и указатель на результат. Функция никаких значений не возвращает.