Студопедия — Переменные-указатели
Студопедия Главная Случайная страница Обратная связь

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

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






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

 

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

 

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

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

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

 

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

 

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

 

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

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

 

значение ?     ? ?
номер                
переменная не занято a ptr не занято
тип int указатель на int
значение   не определено
                 

 

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

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

 

ptr = &a;

 

значение ?     номер 1 ?
номер                
переменная не занято a ptr не занято
тип int указатель на int
значение   адрес перем. a
                 

 

Так же, как с самой переменной a, мы могли значение указателя (значением указателя является адрес!) установить сразу при объявлении указателя:

 

int *ptr = &a;

int *ptr2 = &a;

int *ptr3 = ptr;

 

значение ?     номер 1 номер 1 номер 1
номер                              
переменная не занято a ptr ptr2 ptr3
тип int указатель на int указатель на int указатель на int
значение   адрес перем. a адрес перем. a адрес перем. a
                               

 

В приведенном примере создается три указателя на переменную типа int. В переменные-указатели ptr и ptr2 сразу заносится адрес переменной a, а в переменную ptr3 заносится значение указателя ptr, а раз значением указателя является адрес, и в ptr к тому моменту находится адрес переменной a – в переменной ptr3 тоже окажется адрес переменной a.

 

Может возникнуть вопрос, каким образом адрес кодируется числовыми байтами, ведь не слова же «номер 1» записаны в памяти? Вопрос хороший, и выходящий за пределы этого ликбеза J.

 

Итак, пусть есть имеется переменная ptr, которая является указателем на переменную типа int. Как работают и для чего используют переменные-указатели?

 

int a = 5;

int *ptr = &a;

 

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

// ptr – переменная-указатель, ее значением является адрес

// *ptr – значение по адресу, хранимому в переменной ptr

 

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

 

Вот, например, рассмотрим такой пример:

 

int a = 5;

int *ptr = &a;

int b = a;

// a => 5

// ptr => адрес a

// b => 5

// *ptr => 5

 

значение ?     номер 1    
номер                  
переменная не занято a ptr b
тип int указатель на int int
значение   адрес перем. a  
                   

 

Что теперь произойдет, если мы в переменную a запишем 6?

 

a = 6;

 

значение ?     номер 1    
номер                  
переменная не занято a ptr b
тип int указатель на int int
значение   адрес перем. a  
                   

 

Как видим, значение ptr и значение b не изменились, но:

 

// a => 6

// ptr => адрес a

// b => 5

// *ptr => 6

 

(*ptr) раньше было равно 5, а теперь стало равно 6.

 







Дата добавления: 2015-08-12; просмотров: 295. Нарушение авторских прав; Мы поможем в написании вашей работы!



Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

ТРАНСПОРТНАЯ ИММОБИЛИЗАЦИЯ   Под транспортной иммобилизацией понимают мероприятия, направленные на обеспечение покоя в поврежденном участке тела и близлежащих к нему суставах на период перевозки пострадавшего в лечебное учреждение...

Кишечный шов (Ламбера, Альберта, Шмидена, Матешука) Кишечный шов– это способ соединения кишечной стенки. В основе кишечного шва лежит принцип футлярного строения кишечной стенки...

Принципы резекции желудка по типу Бильрот 1, Бильрот 2; операция Гофмейстера-Финстерера. Гастрэктомия Резекция желудка – удаление части желудка: а) дистальная – удаляют 2/3 желудка б) проксимальная – удаляют 95% желудка. Показания...

Менадиона натрия бисульфит (Викасол) Групповая принадлежность •Синтетический аналог витамина K, жирорастворимый, коагулянт...

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

Дренирование желчных протоков Показаниями к дренированию желчных протоков являются декомпрессия на фоне внутрипротоковой гипертензии, интраоперационная холангиография, контроль за динамикой восстановления пассажа желчи в 12-перстную кишку...

Studopedia.info - Студопедия - 2014-2024 год . (0.012 сек.) русская версия | украинская версия