- •Аннотация
- •Предисловие
- •Г л а в а 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) правильные?
2.4. Ссылка на структуру.
Для структур, как и для простых переменных, можно использовать ссылочный тип. Например, tst &SS1=S1; При этом ссылка на структуру должна быть проинициализирована другой ранее объявленной переменной такого же структурного типа, но не указателем.
По аналогии с простыми переменными после такого объявления SS1 и S1 — это два альтернативных имена (синонимы) одной и той же переменной структурного типа. Поэтому если мы изменим какое-нибудь поле в структуре S1, то этим самым изменится и это же поле в структуре SS1. Например, если выполнить
S1.per=20; cout<<(SS1.per);
то выведем число 20, несмотря на то, что SS1.per мы явно, казалось бы, не меняли.
2.5. Указатели и вложенные структуры
Пусть объявлена структура для хранения декартовых координат одной точки на плоскости:
struct TMyP { float x, y;};
Вторая структура использует её:
struct tst2
{ TMyP p1;
unsigned m;
TMyP *p2;
TMyP *dar;
float per;
} S1, *PS, *D;
1) Доступ к полям структуры S1 выполняется так: S1.per, S1.p1.x, S1.p1.y. Перед использованием указателей их надо проинициализировать. Пусть p2 — адрес одной структуры. Тогда S1.p2=new TMyP; Заметим, что в new записываем тип, указанный при объявлении p2. Тогда доступ к простым полям, не указателям, записывается так: S1.p2–>x , S1.p2–>y. При этом первой используется точка, так как S1 — не указатель, а “стрелку” записали, так как p2 — указатель.
Динамический массив в структуре S1 создаём так:
cin >>S1.m; // Вводим размерностьмассива, например, количество точек
S1. dar=new TMyP[S1.m]; //Создаём динамический массив
// Ввод координат точек
for (int j=0; j<S1.m; j++)
{ cin>>S1.dar[j].x;
cin>>S1.dar[j].y;
}
2) Пусть PS — указатель на одну структуру. Поэтому сначала выполняем
PS= new tst2;
Тогда доступ к простым полям, не указателям, выполняется так:
PS–>per, PS–>p1.x, PS–>p1.y.
Здесь наоборот, первой используется “стрелка” , так как PS —указатель, а “точку” записали, так как p1 — не указатель. Пусть p2 — по-прежнему адрес одной структуры:
PS–>p2=new TMyP;
Тогда доступ к полям записывается так:
PS–>p2–>x , PS–>p2–>y.
При этом дважды используется “стрелка”, так как и PS, и p2 — указатели.
Динамический массив в структуре PS создаём в такой последовательности. Сначала вводим размерностьмассива, например, количество точек
cin >> PS–>m;
Затем резервируем память для массива
PS–>ard=new TMyP[PS–>m];
Ввод координат точек
for (int j=0; j< PS–>m; j++)
{ cin>> PS–>dar[j].x;
cin>> PS–>dar[j].y;
}
Заметим, что для доступа к координатам используется точка, так как dar[j] — это не указатель, а j – я структура. Указателем является имя массива dar, а не его элемент.
3) Пусть, наконец, D —динамический массив структур. Тогда сначала определяем его размерность:
int n; cin>>n; // или const n=5;
Затем резервируем память для этого массива:
D=new tst2[n];
Адрес начала массива структур присваивается переменной указателю D. Доступ к простым полям i– й структуры, не указателям, записывается так:
D[i]. per, D[i]. p1.x, D[i]. p1.y.
Здесь дважды используется “точка”, так как и D[i], и p1 — не указатели.
Пусть p2 — по-прежнему адрес одной структуры. Тогда
D[i].p2=new TMyP;
резервирует память для структуры p2, принадлежащей i-й структуре типа tst2. Доступ к координатам в этом случае такой:
D[i].p2–>x , S1.p2–>y.
При этом первой используется точка, так как D[i] — не указатель, а “стрелку” записали, так как p2 — указатель.
Динамический массив в структуре D[i] создаём так. Вводим размерностьмассива для i-й структуры, например, количество точек i-го многоугольника:
cin >> D[i] .m;
Затем создаём динамический массив
D[i]. dar=new TMyP[D[i].m];
и вводим координаты точек
for (int j=0; j< D[i].m; j++)
{ cin>> D[i].dar[j].x;
cin>> D[i].dar[j].y;
}
Здесь дважды используется “точка”, так как и D[i], и dar[j] — не указатели, а элементы динамических массивов. Указателями являются имена этих массивов, D и dar соответственно. Понятно, что для работы со всеми структурами массива D нужен, как минимум, ещё один цикл по i.