
- •Аннотация
- •Предисловие
- •Г л а в а 1. Введение в указатели
- •§1. Понятие указателя. Операции разыменования и разадресации
- •§2. Инициализация и присваивание указателей
- •§3. Передача параметров функций с помощью указателей.
- •§4. Распределение динамической памяти.
- •4.1. Операция new
- •4.2. Операция delete
- •Упражнения, тесты.
- •Указатели и массивы
- •§1. Связь указателей и массивов
- •1.1. Указатели и одномерные массивы
- •1.2. Указатели и матрицы
- •Int MyFun (int *X, int n)
- •§3. Операции над указателями при работе с массивами.
- •3.1. Арифметические операции
- •3.2. Операции сравнения.
- •§4. Использование операций над указателями при работе с одномерными массивами
- •4.1. Использование индексов
- •4.2. Указатель в качестве параметра цикла
- •4.3. Использование указателя и индекса
- •§5. Строки.
- •5.1. Общая характеристика строк.
- •5.2. Примеры алгоритмов работы со строками.
- •5.3. Анализ строковых функций.
- •§6. Использование операций над указателями при работе со статической матрицей.
- •Упражнения, тесты.
- •Массивы указателей
- •§1. Статический массив указателей
- •§2. Частично динамическая матрица.
- •Int arr_of_size[n];
- •§3. Статический массив строк
- •§4. Динамический массив указателей
- •4.1. Указатель на указатель
- •4.2. Динамические “матрицы”.
- •Int *arr_of_size;
- •4.3. Передача матрицы в функцию
- •Int a[10]; FunArr1(a, 10,…);
- •Упражнения, тесты.
- •Задачи второго среднего уровня.
- •Структуры и другие типы, определяемые пользователем
- •§1. Структуры
- •Объявление структуры
- •1.2. Работа со структурой.
- •1.3. Вложенные структуры и статические массивы в структурах
- •1.4. Статический массив структур
- •§2. Cтруктуры и указатели
- •2.1. Указатели в структуре.
- •2.2. Указатели на структуру
- •2.3. Динамический массив структур
- •2.4. Ссылка на структуру.
- •2.5. Указатели и вложенные структуры
- •§3. Cтруктуры и функции
- •3.1. Передача полей структуры в функцию.
- •Void MyFun1 (int X, float &y, int *u1, float *u2, char *s);
- •3.2. Передача всей структуры в функцию
- •Void Fun1 (tst s,…);
- •Void Fun2 (tst & s,…);
- •Void Fun3 (tst* s,…);
- •§4. Cтруктуры и классы.
- •§5. Объединения.
- •Представление вещественных чисел в памяти компьютера.
- •§6. Поля битов (битовые поля)
- •Ввод в ы в о д
- •Symbol Code16 Code10 Code2
- •§7. Перечисления
- •Какие из строк (//1 – //9) правильные?
Структуры и другие типы, определяемые пользователем
В этой главе рассматриваются структуры и их связь с указателями, объединения, поля битов и перечисления.
§1. Структуры
Объявление структуры
Структура (запись на языке Pascal) — составной (смешанный, сложный, структурированный) тип данных, который под одним именем объединяет несколько переменных разных типов, которые называются полями (элементами или членами) структуры. В качестве полей могут быть переменные простых типов, массивы, структуры и некоторые другие типы. Если в ”старом” языке C в структуру можно было включать только переменные, то в более поздней версии языка, в С++, структура может содержать, как и класс, функции для обработки полей, которые также называются методами. Сравнение структуры и класса смотри в §4.
Существует несколько способов объявления переменной структурированного типа.
В первом способе сначала объявляем тип структуры, а затем по мере надобности используем этот тип для объявления переменных. Такой способ назовём раздельным объявлением. Например,
struct tstr1
{ char name[20];
int arr[12];
float Par;
};
Здесь struct — ключевое слово, tstr1 — название типа по правилам записи идентификаторов. В фигурных скобках по правилам объявления обычных переменных описываем поля структуры: название в виде статической строки, целочисленный массив из 12 элементов и вещественный параметр. Затем объявляем одну или несколько переменных данного типа:
tstr1 S1, S2;
При этом тип и переменные могут быть описаны в одной функции или тип описывается на глобальном уровне, а переменные — в одной или нескольких функциях.
Второй способ назовём совместным объявлением типа и переменной. Например,
struct tPoint
{ float x, y, z;
} Point1, Point2;
При необходимости, как и в первом варианте, можем использовать тип tPoint для объявления других переменных, например, tPoint P3;
Допускается, но на практике редко используется третий способ, так называемое анонимное объявление, при котором имя типа не указывается.
const n=7;
struct { int a [n];
float Aver;
} A1, A2;
Понятно, что при таком способе невозможно использовать определённый таким образом тип для объявления новых переменных, так как нет имени типа.
Тип (tstr1, tPoint) представляет собой абстрактное понятие, шаблон (заготовку) для создания реально существующей в оперативной памяти переменной структурного типа (S1, S2, Point1, Point2,P3, A1,A2). Такую переменную иногда называют экземпляр структуры. Оперативная память отводится не для типа (например, tstr1), а для переменных (S1 и S2). Её объём для каждой переменной типа структуры равен сумме байт, занимаемых каждым полем структуры. Например, переменная A1 занимает память, объём которой равен: 7*4 (для массива a) + 4 (для переменной Aver)=32байта.
В качестве простого упражнения предлагается самостоятельно определить объём памяти для остальных переменных структурного типа.
1.2. Работа со структурой.
Доступ к отдельным полям структуры осуществляется с помощью операции “.” (“точка”). При этом сначала записывается имя структурной переменной (но не типа!), а затем через “точку” — имя поля структуры. Например, ввод массива arr выполняется следующим образом: for (int i=0; i<12; i++) cin>>S1.arr[i]; а оператор gets(S1.name); вводит поле с наименованием. Оператор S1.Par=12.3; полю Par структурной переменной S1 присваивает значение 12.3.
Присваивание структур является одним из преимуществ рассматриваемого типа. Информация, содержащаяся в одной структуре, может быть присвоена другой структуре с помощью одиночного оператора присваивания. Например, оператор S2=S1; копирует все поля (строковую переменную, 12 элементов массива и вещественную переменную) переменной S1 в переменную S2.
При объявлении структуры можно инициализировать её элементы. Например tPoint P2={1.1, 2.2, 0.3};