- •Аннотация
- •Предисловие
- •Г л а в а 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.3. Вложенные структуры и статические массивы в структурах
В качестве поля структуры можно использовать переменную другого ранее определённого структурного типа. В таком случае говорят о вложенных структурах. Например, сначала определим структуру для координат одной точки плоскости:
struct tpoint2 { float x; float y; };
В другой структуре определим координаты центра и радиус окружности:
struct tcircle { tpoint2 senter; float rad;
} MyCircle;
Тогда для ввода координат центра окружности надо выполнить следующий оператор:
cin >> MyCircle.senter.x>> MyCircle.senter.y;
То есть доступ к полям вложенной структуры осуществляется с помощью нескольких операций “точка”.
Полем структуры может быть одномерный или двумерный массивы фиксированной размерности. Пример объявления и доступ к такому полю показан в структуре tstr1(см. 1.1).
1.4. Статический массив структур
Для объявления массива структур желательно сначала определить структурный тип, а затем объявляем массив переменных данного типа. Например, массив из 10 точек структуры типа tpoint2(см. 1.3) объявляем следующим образом:
const n=10; tpoint2 ArrPoints[n];
Такой массив в памяти занимает (4+4)*n= 80 байт. Доступ к полям каждого элемента массива, например, ввод координат точек, осуществляется так:
for (int k=0; k<10; k++)
cin>>ArrPoints [k].x>> ArrPoints [k].y;
Для массива, объявленного
const n=10; tstr1 AS[n];,
доступ к его элементам и полям осуществляется, например, следующим образом:
AS[i].Par=1.2; — полю Par i-го элемента массива структур присваивается значение 1.2 (i=0,1,…,n-1);
int Sum=0; for (int j=0; j<12; j++) Sum+=AS[0].arr[j]; — суммирование всех 12-ти элементов массива arr (поля структуры) 0-го элемента массива структур AS
§2. Cтруктуры и указатели
2.1. Указатели в структуре.
Пусть объявлена следующая структура:
struct tst { char *t;
int m;
float *ard;
float per;
int *p;
} S1;
Перед использованием полей-указателей их надо инициализировать. Один из способов сделать это — использование операции new. С помощью операции S1.t=new char[20]; резервируем память для размещения строки из 20 символов, и адрес её первого байта размещаем в поле структуры t. Для размерности строки можно использовать не только константу, а и переменную, которую необходимо предварительно определить, например, ввести:
unsigned l; cin>>l; S1.t=new char[l];
После этого строку можно вводить (gets(S1.t);) или определить её с помощью функци: strcpy(S1.t, “The first testing”); Доступ к символам строки выполняется с помощью индексов: S1.t[j], где j может принимать значения от 0 до length(S1.t).
Пусть ard— адрес динамического одномерного массива размерности m, включённой в качестве поля структуры. Сначала определяем эту размерность, например, вводим её: cin>>S1.m;, а затем резервируем память для массива: S1.ard=new float [S1.m]; Доступ к элементам такого массива осуществляется также, как и к элементам статического массива. Например, для ввода записываем: for (int j=0; j<S1.m; j++) cin>>S1.ard[j];
В структуре может быть переменная-указатель, в которой хранится адрес переменной простого типа (int *p;). Тогда перед использованием такой переменной необходимо определить значение этого адреса. Это можно сделать одним из следующих способов:
a) с помощью операции new: S1.p=new int;
b) можно использовать адрес ранее определённой переменной:
int b; S1.p=&b;
c) полю можно присвоить ранее определённый адрес:
int *q=new int; S1.p=q;
d) переменную–указатель можно инициализировать с помощью статического массива, имя которого является адресом его начала: int a[10]; S1.p=a;
Доступ к содержимому ячейки, адрес которой находится в S1.p, осуществляется с помощью операции разыменование, например, *(S1.p)=3; или можно без скобок: *S1.p=3; Здесь операция “*” относится к полю структуры, т.е. к переменной p, а не к S1. Но для элементов массива (вариант d) такая операция не нужна: S1.p[j]=5;