VisualCBook
Главная
Новости
Книга
Об авторе
Закачки
Ссылки

Урок 6: Указатели


Это последний урок первой главы. Понимание и изучение этого урока необходимо для дальнейшего изучения следующих уроков этого учебника. Речь здесь пойдёт о фундаментальных понятиях: об облостях памяти, адресном пространстве программы. Настоятельно рекомендую прочитать этот урок.




Стек и куча

Любая пограмма во время выполнения требует некоторого количества виртуальной памяти. Виртуальная память - совокупность оперативной памяти и дискового пространства, выделенного под временные данные. (Примечательно, что любая программа, написанная на С++ считает, что в её распоряжении есть примерно 4 Гб.) Итак, все временные данные, используемые программой, храняться в некой области памяти - её адресном пространстве, которое по определению не может пересечся с другими адресными пространствами. Это обеспечивает отнасительную безопасность для временных данных и исключает нарушение работы процесса из-за сбоя в другом.

Адресное пространство любой программы делится на две области - стек и кучу. Стек значительно меньше, чем куча. Просто объявляя переменную вы создаёте её экземпляр в стеке, который представляет из себя упорядоченный массив таких переменных. Рассмотрим принцип работы стека на следующем примере:

void main(){
    int a;
    ...
    if(...){
      int b;
      ...
    }
}

Поясним приведённый код. Сначала в стек попадает переменная "a", затем, после оператора "if", в него попадает переменая "b". После первой закрывающеся скобки кончается область видимости переменной "b", а значит она больше не нужна и поэтому автаматически удаляется из стека. После второй закрывающеся скобки кончается область видимости переменной "а", и поэтому она также удаляется из стека. Примерно так работае стек. Надеюсь вам было понятно...

Принципы же работы кучи следующии. Все данные в куче хранятся неупорядоченно, в "адресных подпространствах", каторые строго определяются адресом, представимом шеснадцатеричным числом. (Пример: 0x0018DF3A.) Шеснадцатиричное число предваряется префиксом 0х, который собственно, и показывает, что число шестнадцатеричное. Стоит заметить, что в записе числа 8 цифр - отсюда, в частности, и следует, что каждой программе выделяется примерно 4 гигобайта виртуально памяти. О практическом применении кучи читайте ниже...




Указатели

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

Итак, для выделения "адресного подпространства" и хранения его адреса в языке C++ были придуманны указатели. Указатели состаят из двух частей. Первая - область в куче, куда указатель ссылается; вторая - переменная в стек, хранящая адрес этой области в памяти. Эти две части независимы друг от друга, т.е. на одну область в памяти может указывать несколько указателей. Собственно первая часть не имеет к понятию "указатель" никакого отношения, но для простоты понимания будем называть её частью указателя. При удалении стековой части, часть в куче не удаляется и наоборот. Указатель объявляется следующим образом:

//объявим, например указатель на челое число
int *i;
//выделим память под целое число
i= new int;

Для объявления указателя используйте "*", которая должна стоять перед именем переменной. Оператор "new" выделяет память под тип данных, стоящий после него. Использование этого оператора обязательно, т.к. до его использования указатель указывает на нулевую область (0x00000000). Теперь нам необходимо обратиться к стековой или к кучевой составляющей.

//объявим, например указатель на челое число
int *i;
//обращаемся к стековой части
i;
//обращаемся к кучевой составляющей
*i;

Запись "i" аналогична записи соответствующего адреса. В тоже время запись "*i" - разыменование указателя. Результатом такой записи будет значение переменной, хранящейся по этому адресу.

ВНИМАНИЕ: Так как при удалении стековая часть указателя, информация хранящаяся по адресу, записанному в указателе, не удаляется, если не удалять эту информацию специально, может возникнуть утечка памяти. Не забывайте подчищать за собой. Не удаление таких блоков информации из кучи черевато. Для их удаления используйте оператор "delete":

//удаление переменной, содержащейся по адресу,
//записанному в переменной "i"
delete i;

ЗАМЕЧАНИЕ: Стековые переменные, как нестранно, тоже имеют свои адреса. Для их получения используйте "&"

//объявление целочисленной переменной
int i;
//получение адреса переменной "i"
&i;



Ну что, вот и подошла к концу первая глава моего учебника. В ней были разобранны все наиболее значимые базовые понятия С++. Следующая глава полностью посвящена классам и их применению в программирование. Изобретение классов в программировании я думаю сравнимо с появлением дизельного двиготеля в машиностраении, так что я думаю вам будет о чём почитать в главе "Классы". Что же касается указателей, то их реальное практическое применнение напрямую связанно с классами, так что подробнее с ними вы так же познакомитесь в следующей главе...



Предыдущий урок | Оглавление | Следующий урок

Копирование любых материалов сайта без разрешения автора и владельца сайта запрещено.
© 2005 сайт VisualCBook.narod.ru
© 2005 Кадров Никита


Hosted by uCoz