- •3.8. Упражнения 49
- •Введение
- •1. Базовые элементы
- •1.1. Комментарии
- •1.2. Функция «main»
- •1.3. Идентификаторы и пространства имен
- •1.4. Типы
- •1.5. Переменные
- •1.7. Константы
- •1.6. Преобразование типов
- •1.8. Потоковый ввод – вывод
- •1.9. Операции
- •1.9.1. Арифметические операции
- •1.9.2. Поразрядные операции
- •1.9.3. Условный оператор
- •1.9.4. Операции отношения
- •1.9.5. Логические операции
- •1.10. Стандартные математические функции
- •1.11. Упражнения
- •2. Базовые конструкции
- •2.1 Ветвление
- •2.1.1. Конструкция «if – else»
- •2.1.2. Конструкция «switch»
- •2.2. Циклы
- •2.2.1. Цикл «for»
- •2.2.2. Цикл «while»
- •2.2.3. Цикл «do – while»
- •2.2.4. Операторы циклов
- •2.2.5. Вложенность
- •2.3. Упражнения
- •2.3.1. Ветвления
- •2.3.2. Циклы
- •2.3.3. Вложенность
- •3. Указатели. Массивы. Структуры
- •3.1. Указатели
- •3.2. Массивы
- •3.2.1. Статические массивы
- •3.2.2. Динамические массивы
- •3.4. Ссылки
- •3.5. Структуры
- •3.6. Объединение
- •3.7. Переопределение типов
- •3.8. Упражнения
- •3.8.1. Статические и динамические массивы
- •3.8.2. Многомерные массивы
- •3.8.3. Строки
- •4. Функции
- •4.1. Простые функции
- •4.2. Рекурсия
- •4.3. Указатели и ссылки
- •4.3.1. Передаваемые параметры
- •4.3.2. Возвращаемые значения
- •4.3.3. Ссылки и структуры в функциях
- •4.3.4. Указатели и массивы в функциях
- •4.3.5. Указатели и ссылки на функцию
- •4.4. Шаблоны функций
- •4.5. Упражнения
- •4.5.1. Простые функции
- •4.5.2. Параметры – ссылки и параметры — указатели
- •5. Стандартные классы
- •5.1. Класс «pair»
- •5.2. Класс «complex»
- •5.3. Класс «string»
- •5.4. Контейнеры. Алгоритмы. Итераторы
- •5.5. Класс «vector»
- •5.6. Упражнения
- •5.6.1. Класс «string»
- •5.6.2. Класс «vector»
- •6. Файловый ввод – вывод
- •6.1. Операции
- •6.2. Методы
- •6.3. Флаги
- •6.4. Двоичный режим
- •6.5. Упражнения
- •Ллитература
3.4. Ссылки
Ссылка является альтернативным именем объекта и обязательно должна быть инициализирована. Над ссылками не могут выполняться какие-либо действия, поэтому она всегда ссылается на тот объект, которым была инициализирована.
Листинг 3.8. Применеие ссылок.
#include <iostream>
using namespace std;
int main (void)
{
int x = 1;
int &y = x; //ссылка на переменную x;
cout << y << endl << x << endl << endl;
y++;
cout << x << endl;
x++;
cout << y << endl;
return 0;
}
По сути, ссылка является константным указателем, разыменовывающимся при каждом обращении, и над которым не может быть выполнено никаких операций. При использовании ссылок отсутствует необходимость проверять ее, как указатель, на неравенство нулю, так как она всегда адресует какой-либо объект. В связи с чем, к примеру, если параметр функции должен ссылаться на разные объекты во время исполнения или принимать нулевое значение, следует использовать параметр – указатель.
3.5. Структуры
Структура представляет собой переменные или функции, объединенные для удобства работы с ними, так как они могут трактоваться и в качестве самостоятельных элементов, и как единое целое. Простейшим примером структуры может быть точка в пространстве – тройка значений координат. Важным аспектом при работе со структурами является их возможность выступать и в роли параметров при вызове функции, и в роли возвращаемого функцией значения, при этом передачу больших структур удобнее осуществлять не посредством передачи значения, а с использованием механизма указателей или ссылок. В случае с указателем, вместо записи, обусловленной приоритетами операций, «(*структура).элемент» удобнее использовать «структура->элемент».
Листинг 3.9. Примеры структур.
#include <iostream>
using namespace std;
//точка в пространстве – набор из трех координпт;
struct Point
{
double x;
double y;
double z;
};
int main (void)
{
Point p;
p.x = 1;
p.y = 2;
p.z = 3;
p.z++;
cout << p.x << " " << p.y << " " << p.z << endl;
Point *ptrp = &p;
ptrp->y++;
cout << p.x << " " << p.y << " " << p.z << endl;
return 0;
}
Объявление переменных типа структуры может происходить непосредственно за определением самой структуры. Это могут быть, в том числе, и массивы.
Листинг 3.10. Массивы и структуры.
#include <iostream>
using namespace std;
//задание массива из четырех точек;
struct Point
{
double x;
double y;
double z;
} curve[4] = { { 1.2, 1.7, 1.4 },
{ 2.1, 2.8, 2.3 },
{ 2.2, 2.8, 4.3 },
{ 3.3, 3.1, 4.1 } };
int main (void)
{
for (int i = 0; i < 4; i++)
cout << curve[i].x << " " << curve[i].y << " " << curve[i].z << endl;
return 0;
}
Структуры применяются также для создания так называемых. битовых полей. В такой структуре размер каждого элемента указывается в битах после символа двоеточия и все они имеют одинаковый тип. Размер такой структуры определяется целым числом количества байт, необходимого для хранения одного элемента указанного типа, и вмещающего все длинны элементов. Так например, битовое поле из семи «char» – элементов имеет размер одни байт – размер типа «char», а поле из девяти элементов тогоже типа – два байта.
Листинг 3.11. Битовые поля.
#include <iostream>
using namespace std;
//битовое поле;
struct Flags
{
char x : 1;
char y : 1;
char z : 6;
} f;
int main (void)
{
int x;
cin >> x;
f.x = x;
cout << sizeof (f) << endl;
return 0;
}
