Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Указатели и динамическая память






 

Динамическая память - это оперативная память ЭВМ, предоставляемая программе при её работе. Динамическое размещение данных означает использование динамической памяти непосредственно при работе программы. В отличие от этого статическое размещение данных осуществляется компилятором, то есть должны быть известны заранее количество и тип размещаемых данных. При динамическом размещении они могут быть заранее не известны.

Оперативная память ЭВМ представляет собой совокупность ячеек для хранения информации – байтов, каждый из которых имеет собственный номер. Эти номера называются адресами, они позволяют обращаться к любому байту памяти. Язык С++ предоставляет в распоряжение программиста средство управления динамической памятью – так называемые указатели (pointer). Указатель – это переменная, которая в качестве своего значения содержит адрес байта памяти. С помощью указателей можно размещать в динамической памяти любой тип данных. Лишь некоторые из них занимают во внутреннем представлении один байт, остальные – несколько смежных. Поэтому на самом деле указатель содержит адрес только первого байта данных.

В С++ указатели всегда связываются с некоторым типом данных (при этом говорят, что указатель ссылается на соответствующий тип). Хотя адрес – это по существу 32 битное целое число, определяющее положение объекта в оперативной памяти ЭВМ, указатель как бы «помнит» на какого рода данные он ссылается. Объявление указателя выглядит так:

тип_объекта *имя_указателя;

Пример:

int *aa;

double *bb;

Чтобы получить доступ к объекту (переменной), на который указатель ссылается, применяют операцию разыменования указателя *. Например, *aa будет представлять собой значение переменной, на которую ссылается указатель aa. Чтобы, наоборот, получить адрес переменной, нужно применить операцию взятия адреса &. Пример:

double pi=3.14;

double *aa;

 

aa=& pi; // Здесь указателю аа присваивается адрес переменной pi.

printf(“%f”, *aa); // Здесь на печать выводится значение, содержащееся по адресу аа.

 

ВЫДЕЛЕНИЕ И ОСВОБОЖДЕНИЕ ДИНАМИЧЕСКОЙ ПАМЯТИ, РАЗМЕЩЕНИЕ В НЕЙ ПЕРЕМЕННЫХ

 

Основное назначение указателей - создание и обработка динамических структур данных. В С++ можно выделить память под некоторый объект не только с помощью оператора объявления, но и динамически, во время исполнения программы. Выделение памяти для размещения объекта производится с помощью функции malloc() (для доступа к ней необходимо сослаться на заголовки < alloc.h> и < stdlib.h>). Пример:

//------------------------------------------------------------

double *aa; //Объявление указателя на тип double

 

aa=(double*)malloc(sizeof(double)); // Динамическое выделение памяти размера

// sizeof(double)

*aa=2.71; // присвоение значения 2.71 динамической переменной, размещённой по

// адресу aa

printf(“%f”, *aa); // вывод на печать значения динамической переменной

free(aa); // Освобождение памяти, закреплённой за указателем аа.

//-------------------------------------------------------------

Несколько пояснений к примеру. Аргументом функции malloc() является размер области памяти, которую нужно выделить; для этого можно применить операцию sizeof(), которая возвращает размер переменной или типа, указанного в качестве операнда. Функция malloc() возвращает значение типа void* – то есть указатель на пустые данные. Такой указатель нельзя разыменовывать, поскольку неизвестно, на данные какого типа он указывает, поэтому к нему применяется операция приведения типа (double*). Память, выделенную malloc(), следует освободить функцией free(), если динамическую переменную больше не предполагается использовать.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.