Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конструирование.doc
Скачиваний:
3
Добавлен:
22.08.2019
Размер:
182.78 Кб
Скачать

8 Декларация, инициализация указателя. Операции над указателями.

Указатели предназначены для хранения адресов областей памяти.

В C++ различают три вида указателей

-     указатели на объект,

-     функцию и

-     на void,

от­личающиеся свойствами и набором допустимых операций.

Указатель не являет­ся самостоятельным типом, он всегда связан с каким-либо другим конкретным типом.

Указатель на функцию содержит адрес по которому передается управление при вызове функции.

Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа (основного или составного).

Указатель на void применяется в тех случаях, когда конкретный тип объекта, ад­рес которого требуется хранить, не определен (например, если в одной и той же переменной в разные моменты времени требуется хранить адреса объектов раз­личных типов).

Размер указателя зависит от модели памяти.

Можно определить указатель на указатель и т. д.

Указатель может быть константой или переменной, а также указывать на кон­станту или переменную.

Инициализация указателей

Существуют следующие способы инициализации указателя:

1. Присваивание указателю адреса существующего объекта:

2. Присваивание указателю адреса области памяти в явном виде:

char* vp = (char *)0xB8000000:

3. Присваивание пустого значения:

int* suxx = NULL; int* rulez = 0;

4. Выделение участка динамической памяти и присваивание ее адреса указателю:

Операции с указателями

С указателями можно выполнять следующие операции:

РАЗЫМЕНОВАНИЕ * (Эту операцию можно использовать как для получения, так и для изменения значения величины;)

Разадресация(взятие адреса), или кос­венное обращение к объекту (&),

присваивание,

сложение с константой,

вычита­ние,

инкремент (++),

декремент (- -),

приведение типов.

Результат применения к указателям арифметических операций +,- зависит от типа указываемых объектов

9 Операторы для динамического выделения и освобождения памяти.

Различают два типа памяти: статическую и динамическую.

В статической памяти размещаются локальные и глобальные данные при их описании в функциях.

Для временного хранения данных в памяти ЭВМ используется динамическая память. Размер этой памяти ограничен, и запрос на динамическое выделение памяти может быть выполнен далеко не всегда. Для работы с динамической памятью в языке С использовались функции: calloc, malloc, realloc, free и другие.

В С++ для выделения памяти можно также использовать встроенные операторы new и delete.

Оператор new: [::] new [(список_аргументов)] имя_типа [(инициализирующее_значение)] или [::] new [(список_аргументов)] (имя_типа) [(инициализирующее_значение)]

В простейшем виде оператор new можно записать: new имя_типа. Оператор new возвращает указатель на объект типа имя_типа, для которого выполняется выделение памяти. char *str; // str – указатель на объект типа char str=new char; // выделение памяти под объект типа char. В качестве аргументов можно использовать как стандартные типы данных, так и определенные пользователем. Если память не может быть выделена, оператор new возвращает значение NULL. Оператор new позволяет выделять память под массивы. Он возвращает указатель на первый элемент массива в квадратных скобках. При выделении памяти под многомерные массивы все размерности кроме крайней левой должны быть константами. Первая размерность может быть задана переменной, значение которой к моменту использования new известно пользователю. При выделении памяти под объект его значение будет неопределенным. Однако объекту можно присвоить начальное значение. int *a = new int (10234); Память под массив объектов может быть выделена только в том случае, если у соответствующего класса имеется конструктор, заданный по умолчанию.

Для разрушения объекта, созданного с помощью оператора new, необходимо использовать в программе оператор delete.

Оператор delete: [::] delete переменная_указатель // для указателя на один элемент [::] delete [] переменная_указатель // для указателя на массив. Единственный операнд в операторе delete должен быть указателем, возвращаемым оператором new. Если оператор delete применить к указателю, полученному не посредством оператора new, то результат будет непредсказуем.

Использование оператора delete вместо delete[] по отношению к указателю на массив может привести к логическим ошибкам. Таким образом, освобождать память, выделенную для массива, необходимо оператором delete [], а для отдельного элемента - оператором delete. При удалении объекта оператором delete вначале вызывается деструктор этого объекта, а потом освобождается память. При удалении массива объектов с помощью операции delete[] деструктор вызывается для каждого элемента массива.

10 Строки в С++.

В C++ есть два вида строк: С-строки и класс стандартной библиотеки C++ string.

С-строка представляет собой массив символов, завершающийся символом с кодом 0.

Описание строк. Память под строки, как и под другие массивы, может выделяться как компилятором, так и непосредственно в программе. Длина динамической строки может задаваться выражением, длина нединамической строки должна быть только константным выражением. При задании длины необходимо учитывать завершающий нуль-символ. Строки можно при описании инициализировать строковыми константами, при этом нуль-символ в позиции, следующей за последним заданным символом, формируется автоматически: char а[100] = "Never trouble trouble";

Если строка при определении инициализируется, ее размерность можно опускать (компилятор сам выделит память, достаточную для размещения всех символом строки и завершающего нуля): char a[ ] = "Never trouble trouble"; // 22 символа. Для размещения строки в динамической памяти надо описать указатель на char, а затем выделить память с помощью new: char *p = new char [m]; Динамические строки, как и другие динамические массивы, нельзя инициализировать при создании. Оператор char *str = "Never trouble trouble"создает не строковую переменную, а указатель на строковую константу, изменить которую невозможно.

Ввод-вывод строк. Для ввода-вывода строк используются как уже известные нам объекты cin и соut так и функции, унаследованные из библиотеки С. Ввод выполняется до первого пробельного символа (то есть пробела, знака табуляции или символа перевода строки '\n'). Работа strlen заключается в поиске ‘\0’. Если требуется ввести строку, состоящую из нескольких слов, в одну строковую переменную, используются методы getline или get класса istream, объектом которого является cin.

Mетод get1ine считывает из входного потока n - 1 размещается завершающий 0. Если в строке исходных данных более n - 1 символов, следующий ввод будет выполняться из той же строки, начиная с первого несчитанного символа. Метод get работает аналогично, но оставляет в потоке символ перевода строки. В строковую переменную добавляется завершающий 0.

Библиотека содержит также функции, специально предназначенные для ввода- вывода строк: gets и puts.

Функция gets (s) читает символы с клавиатуры до появления символа новой строки и помещает их в строку s. Функция возвращает указатель на строку s, а в случае возникновения ошибки или конца файла — NULL.

Функция puts (s) выводит строку s на стандартное устройство вывода, заменяя завершающий 0 символом новой строки. Возвращает неотрицательное значение при успехе или EOF при ошибке.

Операции со строками. Для строк не определена операция присваивания, поскольку строка является не основным типом данных, а массивом. Присваивание выполняется с помощью функций стандартной библиотеки или посимвольно «вручную» (Можно воспользоваться функциями strcpy или strncpy). Для использования этих функций к программе следует подключить заголовочный файл <string.h>.