Хелпикс

Главная

Контакты

Случайная статья





Тема: Раннее и позднее связывание.



Лекция.

Тема: Раннее и позднее связывание.

Для начала вспомним что такое Указатели.

Переменные-указатели

Что такое указатель? Указатель – это «всего-лишь» переменная, значением которой является адрес. Это переменная, в которой можно сохранить адрес какой-либо другой переменной.

Представьте себе переменную как почтовый ящик с бумажкой внутри, на которой что-то написано. Адрес этой переменной – это номер почтового ящика. Так вот, указатель – это почтовый ящик с бумажкой внутри, на которой написан номер какого-то другого почтового ящика.

Зачем это в принципе может быть нужно? Если продолжать аналогию с почтовыми ящиками, то можно привести такой пример. Пусть у меня есть два почтовых ящика, ящик [1] и ящик [2]. Я хочу, чтобы мои письма доставлялись в какие-то другие почтовые ящики.

Первый вариант этого добиться – это поставить перед почтальоном задачу вида: «Доставь письмо из ящика [1] в ящик [5]». Завтра мне понадобится доставить письмо в ящик [6], и мне придется менять задание почтальону, и в конце концов он все перепутает (грубо говоря – нехорошо каждый раз менять задание, это требует дополнительной информации почтальону).

Другой вариант этого добиться – это поставить перед почтальоном постоянную задачу вида: «Доставь письмо из ящика [1] в ящик, номер которого находится в ящике [2]». Да, это чуть более сложная задача для почтальона, но она постоянная, она не меняется, и он всегда может действовать по одному и тому же шаблону.

Второй вариант называется косвенной адресацией, и ящик [2], как вы уже догадались – это указатель, то есть такая переменная, которая содержит адрес другой переменной.

Так же как переменные различаются типами, указатели тоже бывают разными. Так при объявлении указателя обязательно задается, на переменную какого типа это указатель. То есть, по сути – адрес переменной какого типа будет содержаться в этом указателе. Это может показаться лишним, потому что, в любом случае, указатель – это адрес первого байта в памяти, которую занимает переменная (вне зависимости от того, это переменная какого типа). Но так или иначе, этот тип нужно указывать.

int a = 5; // объявляем перем. a типа int и присв. ей значение 5

int *ptr;  // объявляем ptr как переменную-указатель на переменую типа int

В данном случае мы объявляем новую переменную ptr, в которой будет храниться адрес какой-то переменной типа int. Другими словами, в переменной ptr будет храниться адрес первого байта области в памяти, в которой хранится переменная типа int.

Пока мы только объявили эту переменную, и она пока не содержит никакого осмысленного значения (не содержит осмысленного адреса). Занесем теперь в ptr адрес, например, переменной a.

 

ptr = &a;

 

Так же, как с самой переменной a, мы могли значение указателя

(значением указателя является адрес!) установить сразу при объявлении указателя:

 

int *ptr = &a;

 

То есть самой главной операцией у указателей является *. При объявлении указателя, символ * показывает, что это именно не переменная типа int, а указатель на переменную типа int. А при использовании указателя, символ * перед именем указателя позволяет получить не сам адрес, а значение по этому адресу.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.