Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Указатели.docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
167 Кб
Скачать
☆

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

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

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

    1. с помощью операции получения адреса:

int а = 5; // целая переменная

int* р = &а; //в указатель записывается адрес а

int* р (&а): // то же самое другим способом

    1. с помощью значения другого инициализированного указателя:

int* г = р;

    1. с помощью имени массива или функции, которые трактуются как адрес:

int b[10]; // массив

int * t = b; // присваивание адреса начала массива

void f ( int а ){ /* ... * / } // определение функции

void ( * pf ) ( int ); // указатель на функцию

pf = f; // присваивание адреса функции

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

char* vp = (char *)0хВ8000000;

Здесь ОхВ8000000 — шестнадцатеричная константа, (char *) — операция приведения типа: константа преобразуется к типу «указатель на char».

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

1nt* suxx = NULL;

1nt* rulez = 0;

В первой строке используется константа NULL, определенная в некоторых заголовочных файлах С как указатель, равный нулю. Рекомендуется использовать просто 0, так как это значение типа int будет правильно преобразовано стандартными способами в соответствии с контекстом.

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

Указатели чаще всего используют при работе с динамической памятью («куча»).

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

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

В C++ используется два способа работы с динамической памятью:

  1. Через операции new и delete:

int * n = new int: //1

int * m = new int (10); // 2

int * q = new int [10]; // 3

1: операция new выполняет выделение достаточного для размещения величины типа int участка динамической памяти и записывает адрес начала этого участка в переменную n. Память под саму переменную n выделяется на этапе компиляции.

2: кроме описанных выше действий, производится инициализация

выделенной динамической памяти значением 10.

3: операция new выполняет выделение памяти под 10 величин типа

int (массива из 10 элементов) и записывает адрес начала этого участка в переменную q. которая может трактоваться как имя массива.

Если память выделить не удалось, по стандарту должно порождаться исключение bad_alloc. Старые версии компиляторов могут возвращать 0.

Освобождаем память с помощью delete:

delete n; delete m; delete [ ] q;

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

  1. Через семейство функций malloc, который достался в наследство от C:

int* u = (int *)malloc(sizeof(int)); // 4

4: операция malloc выполняет выделение достаточного для размещения величины типа int участка динамической памяти и записывает адрес начала этого участка в переменную u.

В функцию передается один параметр — количество выделяемой памяти в байтах. Конструкция (int*) используется для приведения типа указателя, возвращаемого функцией, к требуемому типу. Если память выделить не удалось, функция возвращает 0.

Освобождаем память с помощью функции free:

free(u);

Операцию new использовать предпочтительнее, чем функцию malloc, особенно при работе с объектами.

Для того чтобы использовать malloc, требуется подключить к программе заголовочный файл <malloc.h>.