Указатели и итераторы
Когда мы говорили о переменных, мы упоминали, что переменная характеризуется тремя вещами: типом данных, значением, и адресом в ячейке памяти. Указатель - переменная, которая ссылается на блок памяти. Чтобы узнать адрес переменной, нужно воспользоваться унарной функцией взятия адреса: &.
Данный код вывел шестнадцатиричное число. Это и есть адрес переменной n в памяти. Для инициализации указателя используют символ \(*\).
Запустите программу и сравните вывод.
Указатели и массивы
Рассмотрим следующий код:
Что можно заметить? Вывод двух данных строчек одинаковый. Значит, что адрес переменной arr совпадает с адресом первого элемента массива arr. Означает ли это, что arr и указатель на arr[0] это один и тот же объект? А как это узнать?
В C++ существует особый метод, позволяющий узнать значение: typeid(переменная).name().
Вывод подсказывает нам, что это не один и тот же объект, но они оба указывают на одну и ту же область в памяти.
Зачем нужны указатели?
В дальнейшем мы будем использовать указатели, чтобы передавать массивы в функции. Также использование указателей позволяет сократитить используемую память: вместо копирования какого либо объекта мы с помощью указателя можем сослаться на него.
Итераторы
Такая вещь, как итератор применяется в шаблонах, которые мы будем рассматривать уже очень скоро. Но понять основные концепции итераторов можно уже сейчас.
Вам наверняка знакомо такое понятие как контейнер. В C++ тоже есть своего рода контейнеры. Контейнер в C++ это своего рода сегментированная лента:
Итератор - особая сущность, которую используют для обращения к элементам этих самых контейнеров. По умолчанию определины итераторы begin и end
Итератор begin указывает на первую ячейку контейнера, а end - на следующую за последней, то есть на самом деле этой ячейки не существует, но так обозначается конец контейнера.