
- •1)Указатели.
- •3) Инициализация указателей
- •5) Операции с указателями
- •33) Связные структуры данных: стек- описание и операции со стеком.
- •35) Связные структуры данных: очередь- описание и операции.
- •37) Связные структуры данных: список- описание и операции.
- •7) Массивы. Описание одномерных и многомерных массивов, инициализация.
- •9) Ввод и вывод массивов, два способа: с выбором элемента по индексу и с выбором элемента по указателю.
- •27) Передача массивов в качестве параметров.
- •19) . Способы обмена данными: с помощью глобальных переменных.
- •21) Способы обмена данными: Возвращаемое значение.
- •23) Способы обмена данными: Параметры функции.
- •25) Передача параметров по значению и по адресу.
- •29) Параметры со значениями по умолчанию.
- •13) Типы данных, определяемые пользователем: структуры.
- •15)Типы данных, определяемые пользователем: объединения.
- •11) Типы данных, определяемые пользователем: перечисления.
- •4) Понятие класса. Описание класса (Паскаль). Поля и методы. Пример
- •При описании нового объекта с инициализацией другим объектом;
- •При передаче объекта в функцию по значению;
- •При возврате объекта из функции.
- •16) Конструктор и деструктор, их свойства (Паскаль).
- •8) Описание объектов (экземпляров класса) Способы обращения к полям объекта. (Паскаль).
- •17) Функции. Объявление и определение, заголовочные файлы в с и предописания (forward) в Паскале.
- •31) Перегрузка функций.
- •39) Понятие ооп Основные свойства ооп (инкапсуляция, наследование, полиморфизм).
- •24) Виртуальные методы и абстрактные классы.
1)Указатели.
Указатель - это переменная, содержащая адрес некоторого объекта, например, другой переменной. Это дает возможность косвенного доступа к этому объекту через указатель. Пусть x - переменная типа int. Обозначим через px указатель. Унарная операция & выдает адрес объекта, так что оператор px = &x; присваивает переменной px адрес переменной x. Говорят, что px "указывает" на x. Операция & применима только к адресным выражениям, так что конструкции вида &(x-1) и &3 незаконны.
Унарная операция * называется операцией разрешения адреса. Она рассматривает свой операнд как адрес и обращается по этому адресу, чтобы извлечь объект, содержащийся по этому адресу. Следовательно, если y тоже имеет тип int, то y = *px; присваивает y содержимое того, на что указывает px. Так, последовательность px = &x; y = *px; присваивает y то же самое значение, что и оператор y = x; Все эти переменные должны быть описаны: int x, y; int *px; Последнее - описание указателя. Оно говорит, что комбинация *px имеет тип int или, иначе, px есть указатель на int. Это означает, что если px появляется в виде *px, то это эквивалентно переменной типа int. Из описания указателя следует, что он может указывать только на определенный вид объекта (в данном случае int). Разадресованный указатель может входить в любые выражения там, где может появиться объект того типа, на который он указывает. Так, оператор y = *px + 2; присваивает y значение, на 2 больше, чем х.
Если px указывает на х, то *px = 3; полагает х равным 3, а *px + = 1; увеличивает х на 1 , также как и выражение (*px) ++
3) Инициализация указателей
Указатели чаще всего используют при работе с динамической памятью. Доступ к выделенным участкам динамич. памяти, называемым динамич. переменными, производится только через указатели. Время жизни динамич. переменных - от точки создания до конца программы или до явного освобождения памяти. В С ++ используется два способа работы с динамической памятью. Первый использует семейство функций malloc, второй использует операции new и delete. Существуют следующие способы инициализации указателя:
1. Присваивание указателю адреса существующего объекта с помощью операции получения адреса:
int* p = &a; // в указатель записывается адрес a
int* r = p;
________________________________________
int b[10]; // массив
int* t = b; // присваивание имени массива
________________________________________
void (*pf)(int); // указатель на функцию
pf = f; // присваивание имени функции
2. Присваивание указателю адреса области памяти в явном виде:
char* vp = (char *)0xB8000000; // шестнадцатеричная константа
3. Присваивание пустого значения:
int* suxx = NULL; // не рекомендуется; или int* rulez = 0; // так - лучше
4. Выделение участка динамической памяти и присваивание ее адреса указателю с помощью операции new
int* q = new int [10];
Освобождение памяти, выделенной с помощью операции new, должно выполняться с помощью delete
5) Операции с указателями
С указателями можно выполнять следующие операции:
разадресация (*), - предназначена для доступа к величине, адрес которой хранится в указателе.
присваивание,
сложение с константой,
вычитание,
инкремент (++), декремент (- -),
сравнение,
char a; // переменная типа char
char * p = new char;/* выделение памяти под указатель и под динамическую переменную типа char */
*p = 'Ю'; a = *p; // присваивание значения обеим переменным
Присваивание типизированных указателей указателям функций (и наоборот) недопустимо. Арифметические операции с указателями (сложение с целым, вычитание, инкремент и декремент) автоматически учитывают размер типа величин, адресуемых указателями. Эти операции применимы только к типизированным указателям одного типа и имеют смысл в основном при работе со структурами данных, последовательно размещенными в памяти, например, с массивами.
Инкремент перемещает указатель к следующему элементу массива, декремент - к предыдущему. Фактически значение указателя изменяется на величину sizeof(тип). Разность двух указателей - это разность их значений, деленная на размер типа в байтах. Суммирование двух указателей не допускается. При записи выражений с указателями следует обращать внимание на приоритеты операций . В качестве примера рассмотрим последовательность действий, заданную в операторе *p++ = 10; То же самое можно записать подробнее: *p = 10; p++; Выражение (*p)++, напротив, инкрементирует значение, на которое ссылается указатель.