Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++.doc
Скачиваний:
27
Добавлен:
20.08.2019
Размер:
2.26 Mб
Скачать

Арифметические операции над адресами

++ - Инкрементация. Увеличить указатель на 1. После увеличения указатель будет указывать на следующий элемент массива. Т.Е. адрес увеличится на размер элемента типа.

Пример вывода элементов одномерного массива с использованием операции инкрементации

#include <iostream>

using namespace std ;

int main ( )

{

int array [ ] = { 10, 20, 30, 40, 50 } ;

int size = sizeof ( array ) / sizeof ( array [ 0 ] ) ;

// вывод с использованием константного адреса массива

for ( int i = 0; i < size; i++ )

cout << * ( array + i ) << '\t' ;

cout << endl ;

// вывод с использованием указателя

int* p = array ;

int count = 0 ;

do

{

cout << * p++ << '\t' ;

count++ ;

} while ( count < size ) ;

cout << endl ;

return 0 ;

}

. Пример вывода строки с использованием указателя

#include <iostream>

using namespace std ;

int main ( )

{

char s [ 20 ] ;

char* p = s ;

cout << "-> " ; cin >> p ;

cout << "\nWizard - pointer!\n\n" ;

while ( * p )

cout << p++ << endl ;

p = s ;

cout << "\nInitial string -> " << p << endl ;

return 0 ;

}

-- - Декрементция. Уменьшение значения указателя на размер базового типа.

+ - Сложение. Увеличить указатель на целое значение или на величину другого однотипного указателя.

+= - Сложение с замещением. Увеличить существующий указатель на целое значение.

- - Вычитание. Уменьшить указатель на целое значение или на величину другого однотипного указателя.

-= -Вычитание с замещением. Уменьшить указатель на целое значение или на величину другого однотипного указателя.

==,!=,>,<,>=,<= - Отношения.

new - Выделение памяти. Выделяется свободная память в соответствии с базовым типом. Адрес этой памяти передается указателю того же типа.

Delete Освобождение памяти. По адресу указателя освобождается ОП и значение указателя обнуляется.

Пример использования оператора new и delete

#include <iostream>

using namespace std ;

int main ( )

{

int x = 25 ;

cout << "Value x\t" << x ;

// объявление указателя с инициализацией

int* py = new int ( x ) ;

cout << "\nValue *py before delete\t" << * py ;

// освобождение памяти

delete py ;

// состояние памяти после освобождения

cout << "\nValue *py after delete\t" << * py << endl ;

return 0 ;}

Операторы распределения памяти new и delete

Для экономичного управления оперативной памятью существует динамическая стратегия управления – это когда за один сеанс работы программы по ходу выполнения неоднократно выделяется, обрабатывается и если в этом есть необходимость, освобождается оперативная память базового типа.

Формат выделения памяти:

Тип * указатель = new тип; //1 формат

Тип * указатель = new тип (значение); //2 формат

Оператор new выделяет блок памяти базового типа и возвращает указателю адрес на нулевую ячейку этого блока. Если new не в состоянии найти необходимое пространство свободной памяти, то возвращает адрес NULL (никакой), что определяется значением 0. Тип указателя и тип выделяемой памяти обязательно должны совпадать по базовому типу. Когда, используется второй формат одновременно с выделением необходимой памяти производится инициализация содержимого блока памяти указанным в круглых скобках значением.

Пример использования оператора new

#include <iostream>

using namespace std ;

int main ( )

{

// объявление указателей

int* pi ; unsigned short* pu ;

// выделение памяти

pi = new int ;

pu = new unsigned short ( 200 ) ;

// объявление указателя с выделением памяти

double* pd = new double ;

// объявление указателя с инициализацией

float* pf = new float ( -3.15 ) ;

// вывод адресов, выделенных new

cout << "Pointers" ;

cout << "\npi\t" << pi << "\npu\t" << pu ;

cout << "\npd\t" << pd << "\npf\t" << pf ;

// вывод значений

cout << "\n\nValues with initialization" ;

cout << "\n* pu\t" << * pu ;

cout << "\n* pf\t" << * pf ;

cout << "\n\nValues without initialization" ;

cout << "\n* pi\t" << * pi ;

cout << "\n* pd\t" << * pd << endl ;

// присваивание значений и вывод

* pi = - * pu ; * pd = - * pf ;

cout << "\n\nValues after initialization" ;

cout << "\n* pi\t" << * pi ;

cout << "\n* pd\t" << * pd << endl ;

return 0 ;

}

Чтобы освободить блок динамической памяти, выделенный оператором new,необходимо выполнить операцию динамического освобождения памяти delete.

Формат оператора динамического освобождения памяти:

delete указатель;

После освобождения динамической памяти указатель получает адрес 0 (NULL) и операционная система помечает ее как свободную. В связи с этим не следует использовать указатели на освобожденную память.