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

Указатели и динамические массивы

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

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

Тип указатель = new тип [размер];

Формат оператора delete для освобождения памяти занятой динамическим массивом:

delete [] указатель;

Размер в операторе new записывается в квадратных скобках и задает число элементов создаваемого массива. В результате выполнения оператора указатель получает адрес нулевого элемента. Следовательно, адрес каждого элемента находится указатель + индоксная, а значение по адресу хранящемуся в указателю, т.е.:

- * указатель + индоксная;

- *указатель[индоксная];

- указатель[индоксная];

В операторе delete размер не указывается, но наличие квадратных скобок является обязательным. Оператор освобождает память от всех элементов массива, а указатель теряет адрес нулевого элемента.

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

#include <iostream>

using namespace std ;

int main ( )

{

// ввод размера массивов

int size ; cout << "Enter size of array -> " ; cin >> size ;

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

double* pdArray = new double [ size ] ;

int* piArray = new int [ size ] ;

// адреса элементов массивов

cout << "\nAddresses for double\n" ;

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

cout << ( pdArray + i ) << '\t' ;

cout << "\n\nAddresses for int\n" ;

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

cout << ( piArray + i ) << '\t' ;

// значения элементов массива целых чисел

cout << "\n\nValues of integer array\n" ;

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

{

* ( piArray + i ) = i * i ; //piArray[i]

cout << * ( piArray + i ) << "\t\t" ;

}

cout << endl ;

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

delete [ ] piArray ; delete [ ] pdArray ;

return 0 ;

}

Указатели и спецификатор const

Если спецификатор const стоит перед именем типа, то объявляется указатель на константу.

Пример объявления указателя на константу

const char A = 'A' ;

const char* pC = &A ;

const char Z = 'Z' ; pC = &Z ;

Невозможно изменить значение переменной, на которую указывает указатель, но можно изменить значение самого указателя. Это полезно при передаче аргументов в функцию, когда аргументы нельзя изменить.

Если спецификатор const стоит непосредственно перед идентификатором указателя, то объявляется константный указатель.

Пример объявления константного указателя

char* const pCH = new char [ 40 ] ;

int * const pi = new int [100];

// константный указатель на константу

const char* const p = "constant pointer on a constant" ;

В этом случае, нельзя изменить значение указателя, но можно изменить значение того, на что он указывает. Указатели, которые объявлены константными, должны получить начальное значение при объявлении. Константный указатель всегда указывает на одну и ту же ячейку памяти.

Пример использования указателей со спецификатором const

// Пример указателей с модификатором const

#include <iostream>

using namespace std ;

int main ( )

{

// указатель на константу

cout << "Pointer on constant\n" ;

const char A = 'A' ; const char* pC = &A ;

cout << "I pointer " << &pC ;

cout << "\tmy constant " << *pC << endl ;

// указатель можно изменить

const char Z = 'Z' ; pC = &Z ;

cout << "And now\t\t\tmy constant " << *pC << endl ;

// константный указатель

cout << "\nThe constant pointer" ;

char* const pCP = new char [ 40 ] ;

char s1 [ ] = "As you brew," ;

char s2 [ ] = "so must you drink." ;

strcpy_s ( pCP, 40, s1 ) ;

cout << '\n' << &pCP << " point on ->\t" << pCP ;

// содержимое можно изменить

strcpy_s ( pCP, 40, s2 ) ;

cout << "\nAnd now I point on ->\t" << pCP << endl ;

// константный указатель на константу

const char* const p = "constant pointer on a constant" ;

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

delete [ ] pCP ;

// ошибки

// *pC = 'Z' ; // *pC - символьная константа

// pCP = new char [ 20 ] ; // pCP - константный указатель

// p = new char [ 40 ] ; // p - константный указатель

// * ( p + 7 ) = 'T' ; // * ( p + 7 ) - константный символ

// delete pC ; // pC - не было new

// delete [ ] s1 ; // s1 - массив

return 0 ;

}