
- •Д.С. Семенов
- •Содержание
- •Введение
- •Лабораторная работа №1 Программирование алгоритмов линейной структуры
- •Основные теоретические сведения
- •Арифметические операции и операции присваивания
- •Математические функции - файл math.H
- •Варианты заданий
- •Лабораторная работа №2 Программирование алгоритмов разветвляющейся структуры
- •Оператор передачи управления
- •Лабораторная работа №3 Программирование алгоритмов циклической структуры
- •Оператор цикла с предусловием
- •Операторы прерывания цикла
- •Лабораторная работа №4 Программирование алгоритмов над статическими массивами
- •Лабораторная работа №5 Программирование алгоритмов над многомерными динамическими массивами
- •Delete имя_указателя;
- •Имя_массива[индекс]
- •Delete [] имя_указателя;
- •Тип_массива ** имя_указателя;
- •Лабораторная работа №6 Программирование алгоритмов над массивами символов
- •Основные теоретические сведения
- •Список используемой литературы:
- •Математические функции - файл math.H
- •Функции ввода-вывода для стандартных файлов
- •Функции для работы со строками
- •Функции для работы с терминалом в текстовом режиме
- •Функции для выделения и освобождения памяти
- •Специальные функции
- •Компонентные функции класса ios
- •Компонентные функции класса istream
- •Компонентные функции класса ostream
- •Функции – манипуляторы
- •Параметризованные функции – манипуляторы – файл iomanip.H
- •Компонентные функции класса filebuf
- •Компонентные функции классов ifstrefm, ofstream, fstream
- •Режимы файла,
- •Приложение 2
- •Полная таблица десятичных, шестнадцатеричных и двоичных ascii - кодов
- •Продолжение табл. П1.18
Delete имя_указателя;
Пример
int *B=new int;
…
delete B;
объявляет указатель, выделяя и освобождая место под объект в адресном пространстве.
Освобождение памяти уничтожает сам объект, а не указатель. В дальнейшем, указателю можно заново выделить участок памяти под новый объект и освободить эту память, что позволяет более гибко использовать оперативное адресное пространство компьютера. Поэтому, объекты созданные с помощью операции new называются динамическими.
long *P;
…
P=new long;
…
delete P;
…
P=new long;
…
delete P;
Операция delete освобождает память, но сама не задает указателю значение NULL, поэтому во избежание использования в дальнейшем неинициализированного указателя желательно это делать программно.
delete P;
P=NULL;
Операции над указателями
Указатели могут применяться как операнды в арифметических выражениях, выражениях присваивания и выражениях сравнения. Однако, не все операции, обычно используемые в этих выражениях, разрешены применительно к переменным указателям.
С указателями может выполняться ограниченное количество арифметических операций. Указатель можно увеличивать (++), уменьшать (--), складывать с указателем целые числа (+ или +=), вычитать из него целые числа (- или -=) или вычитать один указатель из другого.
Сложение указателей с целыми числами отличается от обычной арифметики. Прибавить к указателю 1 означает сдвинуть его на число байтов, содержащихся в переменной, на которую он указывал. Обычно подобные операции применяются к указателям на массивы. Например, запись
int *Pt;
…
Pt+=2;
увеличит значение Pt (т.е. адрес в памяти, на который указывает Pt), не на два, а на четыре байта, так как один объект целочисленного типа int в памяти занимает два байта.
Аналогичные правила действуют и при вычитании из указателя целого значения.
Однако при использовании арифметических операций над указателями нельзя полагать, чтоб две переменные – указатели одинакового типа будут находится в памяти вплотную друг к другу, если только они не соседствуют в массиве.
Сравнение указателей операциями >, <, >=, <= также имеют смысл только для указателей на один и тот же массив. Однако, операции отношения == и != имеют смысл для любых указателей. При этом указатели равны, если они указывают на один и тот же адрес в памяти.
Указатель можно присваивать другому указателю, если оба указателя имеют одинаковый тип. В противном случае нужно использовать операцию приведения типа, чтобы преобразовать значение указателя в правой части присваивания к типу указателя в левой части присваивания. Исключением из этого правила является указатель на void (т.е. void*), который является общим указателем, способным представлять указатели любого типа. Указателю на void можно присваивать все типы указателей без приведения типа. Однако указатель на void не может быть присвоен непосредственно указателю другого типа – указатель на void сначала должен быть приведен к типу соответствующего указателя.
Связь массивов и указателей
Массивы и указатели Си++ тесно связаны и могут быть использованы почти эквивалентно. При определении массива, имя массива является указателем константой, значением которой служит адрес первого элемента массива (с индексом 0), а запись