![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Указатели и динамическая памятьСтр 1 из 5Следующая ⇒
Динамическая память - это оперативная память ЭВМ, предоставляемая программе при её работе. Динамическое размещение данных означает использование динамической памяти непосредственно при работе программы. В отличие от этого статическое размещение данных осуществляется компилятором, то есть должны быть известны заранее количество и тип размещаемых данных. При динамическом размещении они могут быть заранее не известны. Оперативная память ЭВМ представляет собой совокупность ячеек для хранения информации – байтов, каждый из которых имеет собственный номер. Эти номера называются адресами, они позволяют обращаться к любому байту памяти. Язык С++ предоставляет в распоряжение программиста средство управления динамической памятью – так называемые указатели (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(), если динамическую переменную больше не предполагается использовать.
|