Указатели? Это просто! С++ #2

Доброго дня всем.

Итак, сейчас я продолжу рассказ о указателях, который начал вот в этой статье.

Допустим, мы объявили целочисленную переменную и присвоили ей значение 10:

В результате данных манипуляций процессор выделил ячейку в памяти размером 4 байта и присвоил ей некий адрес. И обратится к ней мы можем двумя способами:

  1. По адресу в памяти — прямая адресация.
  2. По идентификатору (имени переменной) — косвенная адресация.

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

В языках высокого уровня (языки, которые далеки от машинного кода) повсеместно используется косвенная адресация — это намного удобнее.

Все, теперь поговорим, собственно, о указателях (не может быть!).

Указатели — это обычные переменные, которые созданы для хранения адресов других переменных. Для них точно так же выделяется ячейка памяти (в неё помещается какой-либо адрес вместо значения, как в случае обычных переменных) и этой ячейке присваивается шестнадцатеричный адрес, как и всем другим переменным . Стоит отметить, что размер этой ячейки зависит от архитектуру ОС, т.е., если система 32-х разрядная, то для  того, чтобы в указатель могли поместится любые адреса, нужно 4 байта (4 байт = 32 бит), а в случае 64-х разрядной системы потребуется уже 8 байт. Такие вот пирожки с котятами.

Для объявления указателя в С++ используется оператор  «звездочка» — «*».  И делается это вот таким макаром:

В результате мы получили указатель на целочисленную переменную. Тип указателя очень важен! Если мы объявили указатель как целочисленный, то мы можем помещать в него адреса только переменных типа int. Т.е., если объявили указатель типа float (тип с плавающей точкой), то и адреса туда можно помещать только переменных типа float. «Зачем это нужно? Ведь все указатели и так будут занимать одно и то же количество памяти» — спросите вы. На ваш логичный (и очень правильный!) вопрос я отвечу чуть позже (там будет все просто, как и всегда :)).

Мы объявили указатель, но он ни на что не указывает! Как же быть?

А вот для этого, есть еще один оператор — «&» (амперса́нд). Он называется оператором взятия адреса (еще он служит для создания ссылок, но это тема для отдельной статьи). Далее пример:

Теперь в указателе хранится адрес переменной variable. И если мы выведем значение указателя вот таким образом:

То получим что-то такое:

addr

0032F9DC — это адрес переменной variable в оперативной памяти.

Теперь очень важный момент (сосредоточиться!). «*» служит не только для объявления указателя, но и является оператором для обращения по адресу хранящемуся в указателе (звездочка работает в этом ключе только с указателями).

Например, cout<<*pointer; равносильно cout<<variable;

Для наглядности скомпилируем этот код:

После компиляции получим:

 

value

Ч.т.д.

Теперь, наконец-то, расскажу зачем же указателям нужны типы.

Для примера объявим массив из пяти элементов:

В памяти он будет выглядеть как сплошная лента из пяти блоков по 4 байта и адрес нулевого элемента будет являться адресом массива:

array1

 

Стоит отметить, что когда мы обращаемся к массиву вот так: mass (без скобочек квадратных), то получаем адрес нулевого элемента массива.

Т.е. если мы напишем вот такую строку:

То в указателе будет хранится адрес нулевого элемента.

Если написать cout<<*pointer;, то на экране получим .

А вот, если мы напишем (pointer+1) — это уже будет адрес второго элемента. Таким образом мы смещаем указатель на один элемент. Указав тип указателя, мы говорим компилятору, что адрес будет смещен именно на 4 байта (а не на 3 или 5).

Выглядит все это так:

array3

 

Вот если бы мы создали символьный массив char и записали адрес его нулевого элемента в указатель символьного типа, то при прибавлении единицы адрес сместился бы на 1 байт.

В следующем коде я создам массив и выведу всего его элементы с помощью указателя:

Вывод:

output-array

 

Видите как все просто :) ? Я ведь говорил.

В завершение скажу, что обращение к элементам массива через указатели работает несколько быстрее, чем обычное обращение через индекс (навроде mass[3] и т.д.).

Теперь, я надеюсь, вы поняли, что указатели - это просто!

Если что-то непонятно, то пишите в комментарии — с удовольствием отвечу.

Всем спасибо за внимание.

 

Поддержать сайт и автора: Z208212694629
R429062753687
Яндекс деньги - https://money.yandex.ru/to/410013974912682

Подпишись:
На мой канал youtube
На рассылку свежих статей
На группу ВК
На группу в ОК

Понравилась статья? Поделись с друзьями)

Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники

Указатели? Это просто! С++ #2: Один комментарий

  1. Уведомление: Указатели? Это просто! С++ #1 | Всего наилучшего — 73!

Добавить комментарий