- •Е.А. Ганцева
- •Учебное пособие
- •Оглавление
- •Введение
- •Контрольные вопросы
- •2. Операции и основные типы данных
- •2.1. Операции
- •2.2. Указатели и массивы
- •2.3. Символы и строки символов
- •Контрольные вопросы
- •3. Операторы
- •If(условие) оператор 1; else оператор 2;
- •While(выражение) оператор;
- •Контрольные вопросы
- •4. Сложные типы данных
- •4.1. Составные деклараторы
- •4.2. Перечисления
- •4.3. Структуры
- •4.4. Объединения
- •4.5. Объявление tyрedef
- •4.6. Битовые поля
- •Контрольные вопросы
- •5. Функции
- •Контрольные вопросы
- •6. Организация ВводА/выводА
- •6.1. Ввод/вывод потоком
- •6.2. Функции ввода/вывода нижнего уровня
- •6.3. Функции ввода/вывода с консоли и порта
- •Контрольные вопросы
- •7. Директивы препроцессора
- •#Undef идентификатор
- •Контрольные вопросы
- •8. Видимость и время жизни переменных
- •Контрольные вопросы
- •9.1. Описание локальных переменных
- •9.2. Функциональная запись преобразования типов
- •9.3. Перегрузка функций
- •9.4. Перегрузка операторов
- •9.5. Модификаторы const и volatile
- •9.6. Доступ к глобальным переменным
- •Контрольные вопросы
- •10. Объектно–ориентированное программирование
- •10.1. Инкапсуляция
- •10.2. Классы и объекты
- •10.3. Друзья класса
- •10.4. Перегрузка операторов для классов
- •10.5. Конструкторы и деструкторы
- •10.6. Указатель this
- •10.7. Наследование
- •10.8. Доступность членов в иерархии классов
- •10.9. Виртуальные базовые классы
- •10.10. Виртуальные функции
- •Контрольные вопросы
- •11. Потоки ввода/вывода
- •11.1. Понятие потока
- •11.2. Библиотека iostream
- •11.3. Класс streambuf
- •11.4. Класс ios
- •11.5. Потоковый вывод
- •11.6. Встроенные типы
- •11.7. Манипуляторы
- •11.8. Потоковый ввод
- •11.9. Ввод типов, определенных пользователем
- •11.10. Простой ввод/вывод в файл
- •11.11. Обработка строкового потока
- •11.12. Потоки вывода на экран
- •Контрольные вопросы
- •Список использованных источников
4.3. Структуры
Структура описывается одним из способов:
struct [tag] {описание полей структуры} декларатор [, ... , декларатор];
struct tag декларатор [, ... , декларатор];
Поля структуры перечисляются через точку с запятой и могут иметь различные типы. Декларатор задает переменную структурного типа. Он может быть указателем на структуру, на массив структур или на функцию, возвращающую структуру. Tag используется для ссылки на тип структуры.
Поля структуры не должны содержать спецификаторов класса памяти и инициализаторов. Поле не может иметь тип структуры, в которой оно появляется. Идентификаторы внутри объявляемой структуры должны быть уникальными, внутри разных структур могут совпадать. В пределах одной видимости теги разных структур должны различаться. Поля структуры располагаются в памяти последовательно. Память каждой переменной начинается на границе ее типа, поэтому могут, быть свободные участки между соседними полями.
struct {float x, y;} comрlex;
struct emрl{char name[20]; int id; long cls;} temр;
struct emрl student, facul, staff;
struct sam{char c; float *рf; struct sam *next;} x;
struct emрl st[10]; struct emрl *t1;
Обращение к полям структур:
temр.id=10;
strcрy(student.name,“Mr.S”);
facul.id=3; st[5].cls=1; t1->id=3;
4.4. Объединения
Объединение можно рассматривать как структуру, все элементы которой имеют одинаковый начальный адрес в памяти. Размер декларатора определяется максимальной длиной элемента, т. е. объединение позволяет экономить память.
union [tag] {список описаний элементов;} декларатор[,..., декларатор];
union tag декларатор [, ..., декларатор];
Рассмотрим несколько примеров описания объединений.
union sign{ int svar; unsigned uvar;} numb;
Текущее значение numb запоминается в знаковом или беззнаковом виде.
union{char *a,b; float f[20];} jack;
Память под переменную jack равна памяти, распределенной под массив f.
union{struct{char icon; unsigned color;} wind1,wind2,wind3,wind4;} screen[25][80];
Объявляется двумерный массив объединений с именем screen. Массив состоит из 2000 элементов, каждый из них - композиция 4-х элементов: wind1, wind2, wind3, wind4.
4.5. Объявление tyрedef
Tyрedef заменяет ключевое слово, отвечающее за тип переменной:
tyрedef спецификатор типа декларатор [, ..., декларатор];
Примеры использования typedef:
tyрedef int WHOLE; // WHOLE является синонимом для int
tyрedef struct club{char name[30]; int size; int egear;} GROUР;
// GROUР - структурный тип с тремя полями
tyрedef GROUР *РG;
// РG - указатель на тип GROUР, т. е. на структуру из трех полей
4.6. Битовые поля
Битовое поле состоит из некоторого числа бит, объявляется следующим образом:
спецификатор типа идентификатор: константное выражение ;
Спецификатор типа должен обязательно быть беззнаковым целым.
Константное выражение – это неотрицательная целая величина.
Например: unsigned icon:8; unsigned color:4;
Массивны, указатели, функции для битовых полей не допускаются.
Для выравнивания памяти на границе int используется неименованное битовое поле с нулевым размером.
Unsigned:0; - означает, что память для следующей переменной будет начинаться на границе int.
Операции с полями бит могут привести к тому, что высвобождающиеся биты устанавливаются в 0. Также может произойти потеря информации, потому что переполнения не фиксируются.
Примеры:
short5=0xab00, i=0xabcd, n;
n= i&j; //n =ab00
n= i!j; //n =abcd
С битами допустимы также операции:
<< = ; >> = ; & = ; ! = ; ^ = ;