4868

Указатели. Адресная арифметика. Ссылки

Лекция

Информатика, кибернетика и программирование

Указатели. Адресная арифметика. Ссылки. Указатели – особый тип данных. Указатель хранит адрес, по которому в памяти располагается некоторый объект (переменная, массив, функция). Можно упрощенно представить память компьютера в виде массива после...

Русский

2012-11-28

41 KB

8 чел.

Указатели. Адресная арифметика. Ссылки.

Указатели – особый тип данных. Указатель хранит адрес, по которому в памяти располагается некоторый объект (переменная, массив, функция). Можно упрощенно представить память компьютера в виде массива последовательно пронумерованных (адресованных) ячеек (байт). Любой переменной соответствует определенный участок памяти, представляющий собой непрерывную «цепочку» байт необходимого размера. Размер зависит от типа переменной. Например, переменная типа char всегда занимает ровно 1 байт, а переменная типа int может занимать 2 и больше байта (в зависимости от архитектуры компьютера и используемого компилятора). Соответственно, зная адрес начала участка памяти, выделенного для некоторой переменной, а также её тип, можно обеспечить чтение и запись этой переменной косвенным образом, через её адрес. Возможность такой косвенной работы с переменными (а также с массивами и функциями) осуществляется с помощью указателей.

Объявления указателя на переменную выглядит так:

 тип_переменной * имя_указателя;

Адрес переменной можно получить с помощью оператора &, в следующем примере указатель p инициализируется адресом переменной i:

int i = 10; 

int * p = & i;

Указателю любого типа можно присвоить значение 0, что означает, что указатель не адресует никакой переменной.

Косвенное обращение к переменной, адрес которой хранит указатель, осуществляется с помощью оператора разыменовывания (dereferencing) *, в приведенном ниже примере значение переменной d изменяется косвенным образом через указатель pd:

double d = 10;

 double * pd = & d;

*pd = 20;

std::cout << "d: " << d << std::endl;

Попытка косвенного обращения через указатель, имеющий нулевое значение, приведет к ошибке времени выполнения (run-time).

Указатели одного типа можно присваивать друг другу, при этом оба указателя будут ссылаться на один и тот же объект:

 

 float f = 1.0;

 float * pf1 = & f; // pf1 хранит адрес переменной f

 float * pf2 = pf1; // pf2 тоже хранит адрес переменной f

* pf2 = 2.0;       // теперь f == 2.0

 float g = * pf1;   // теперь g == f (2.0)

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

 

 int i = 10;

   float * pf = & i; // ошибка

Иногда возникают ситуации, когда нужно только само значение адреса, а не объект, на который он указывает (например, нужно сравнить адрес с каким-то другим). Для этого существует специальный указатель void, который может адресовать любой тип данных. Однако, поскольку тип объекта, адресуемого таким указателем, неизвестен, никакие манипуляции с объектом через этот указатель не допустимы. Все, что можно сделать – присвоить его значение другому указателю или сравнить его с какой-либо адресной величиной.

  int i = 10;

  float f = 5.0;

  void * pv = & i; // допустимо

  pv = & f; // допустимо

  *p v = 1; // ошибка!

Применение оператора взятия адреса & к объекту типа int возвращает результат типа int*. Если ту же операцию применить к объекту типа int * (указатель на int), получим указатель на указатель на int, т.е. int**. int** – это адрес переменной, которая содержит адрес переменной типа int. В следующем примере, разыменовав ppi, мы получим переменную типа int*, содержащую адрес переменной i. Чтобы получить значение переменной i, операцию разыменовывания к ppi надо применить дважды:

 

      int i = 10;

  int * pi1 = & i; // pi1 получает адрес i

  int ** ppi = & pi1; // ppi получает адрес pi1

  int * pi2 = * ppi;  // pi2 получает значение pi1 косвенно,

                      // через указатель ppi. Фактически,

                      // теперь pi2 тоже содержит адрес i

  

  int j = **ppi; // j получает значение i косвенно,

                 // используя двойную адресацию

Адресная арифметика.

 Указатели могут быть использованы в арифметических выражениях. К указателю можно прибавлять или вычитать целое значение. Прибавление к указателю 1 увеличивает хранящееся в нем значение адреса на размер области памяти, используемый переменной соответствующего типа. Это позволяет использовать указатели при работе с массивами: поскольку в массивах все элементы располагаются в памяти последовательно, прибавление к указателю 1 означает «перевод» его на следующий элемент массива:

      int A[10];

  int * it = & A[0]; // Указатель на начало массива

  int * end = & A[10]; // Указатель на конец массива,

                       // фактически, это адрес участка памяти,

                       // расположенного сразу после последнего

                       // элемента массива

  while ( it != end ) // пока не дошли до конца массива

  {

     *it = rand(); // записываем в текущий элемент случайное число

     ++it; // увеличиваем указатель на 1,

           // т.е. переходим к следующему элементу массива

  }

 Ссылки.

Ссылочный тип служит для задания переменной дополнительного имени (синонима). Ссылка позволяет косвенно манипулировать переменной, аналогично указателю. Чаще всего ссылки используются в качестве формальных параметров функций. Ссылочный тип описывается указанием оператора взятия адреса & перед именем переменной. Ссылка обязательно должна быть инициализирована. Определив ссылку, невозможно изменить её так, чтобы работать с другим объектом.

  int i = 10 , j = 5;

  int & ri = i; // ri - синоним переменной i

  int & ri2; // Ошибка - ссылка не инициализирована

Все операции со ссылкой относятся к адресуемой ей переменной, в том числе присваивание и взятие адреса:

  ri = j; // i получает значение j через ссылку ri

  ri++; // i увеличивается на 1 через ссылку ri

     int * pi = & ri; // указатель pi получает значение

                   // адреса i через ссылку ri


 

А также другие работы, которые могут Вас заинтересовать

31501. Регулювання фінансового ринку 119 KB
  Регулювання фінансового ринку Сутність принципи та напрями регулювання фінансового ринку. Рівні та форми регулювання фінансового ринку. Державне регулювання фінансового ринку України. Внутрішнє регулювання фінансового ринку.
31502. РИЗИК І ЦІНА КАПІТАЛУ 194.5 KB
  Розвиток теорій ризику. Формула Фішера що в літературі має назву ефект Фішера виглядає таким чином: Ri=RfIP де Ri ціна капіталу з урахуванням ризику процентна ставка в умовах інфляції; Rf номінальна ставка; IP інфляційна премія рівень інфляції. На вторинному ринку оцінювання фінансових активів здійснюється за допомогою їх переоцінки коригування ринкової ціни так щоб фінансовий актив певного рівня ризику забезпечував відповідний рівень доходу. Особливістю фінансового ризику є ймовірність зазнати збитків у результаті проведення...
31503. РИНОК КАПІТАЛІВ 110.5 KB
  РИНОК КАПІТАЛІВ Основи організації ринку капіталів. Кредитний ринок як складова ринку капіталів. Основи організації ринку капіталів Ринок капіталів це частина фінансового ринку де формується попит і пропозиція на середньостроковий та довгостроковий позиковий капітал. Економічна роль ринку капіталів полягає в його спроможності об'єднати дрібні розрізнені кошти і на основі цього активно впливати на концентрацію і централізацію виробництва та капіталу.
31504. Грошовий ринок 156.5 KB
  Грошовий ринок Сутність та особливості функціонування грошового ринку. Структура грошового ринку та його інструменти. Міжбанківський ринок та операції що здійснюються на міжбанківському ринку. Сутність та особливості функціонування грошового ринку Грошовий ринок у ринковій економіці це система грошових відносин на фінансовому ринку яку формують банківські та спеціальні фінансовокредитні інститути що забезпечують функціонування грошових ресурсів країни їх постійне переміщення під впливом законів попиту та пропозиції.
31505. Поняття і класифікація фінансового посередництва 149.23 KB
  Типи фінансових посередників. Функції фінансових посередників. Суть значення та переваги діяльності фінансових посередників Діяльність фінансових посередників є обов'язковим атрибутом сучасної економіки. В умовах розвинутої ринкової економіки свою діяльність здійснює величезна кількість фінансових посередників які за винагороду надають різні види фінансових послуг В Україні інститут фінансового посередництва знаходиться в стадії становлення та розвитку.
31506. Цінні папери 173.5 KB
  Сутність і характерні ознаки цінних паперів. Типологізація цінних паперів. Роль цінних паперів на фінансовому ринку. Роль приватизаційних паперів на фінансовому ринку.
31507. ПОХІДНІ ЦІННІ ПАПЕРИ ТА ОСОБЛИВОСТІ ФУНКЦІОНУВАННЯ РИНКУ ПОХІДНИХ ЦІННИХ ПАПЕРІВ 171 KB
  ПОХІДНІ ЦІННІ ПАПЕРИ ТА ОСОБЛИВОСТІ ФУНКЦІОНУВАННЯ РИНКУ ПОХІДНИХ ЦІННИХ ПАПЕРІВ. У вітчизняній практиці на фінансовому ринку більш широкого застосування здобули операції з традиційними фінансовими інструментами з угодами предметом яких є грошові кошти або їх еквіваленти такі як кредиторська і дебіторська заборгованість; векселі; акції; облігації; факторинг форфейтинг фінансова оренда; гарантії кредитної лінії страхові угоди фінансового характеру тощо. Серед інструментів ринку похідних цінних паперів розрізняють сурогати цінних...
31508. Умови праці та режими праці й відпочинку 308 KB
  Умови праці та режими праці й відпочинку Зміст учбового матеріалу: 1. Умови праці та фактори їх формування 2. Нормативноправове регулювання та оцінка рівня умов праці 3. Суть працездатності людини та її залежність від режимів праці і відпочинку 4.
31509. Трудовий процес та його організація 121 KB
  Трудові процеси: суть види принципи організації Процес виробництва це єдність трудового і технологічного процесів створення певного виду продукції коли на предмет праці діє людина та знаряддя праці. Технологічний процес це цілеспрямована зміна форми розмірів стану структури положення місця предметів праці. Отже зміст трудового процесу визначається сукупністю методів і прийомів праці працівника або групи працівників потрібних для виконання роботи за всіма її стадіями які складаються з наступного: одержати завдання; інформаційна і...