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


 

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

27131. Ситуационное лидерство (ситуационное руководство) 14.5 KB
  Ситуационное лидерство ситуационное руководство это стиль управления людьми предполагающий использование одного из четырех стилей управления в зависимости от ситуации и уровня развития сотрудников по отношению к задаче. Стили лидерства: Директивный стиль или Лидерство путем приказа высокая ориентация на задачу и низкая на людей. Наставнический стиль или Лидерство путем продажи идей совмещение высокой ориентированности на задачу и на людей. Поддерживающий стиль или Лидерство путем участия в организации процесса работы высокая...
27132. Оценка эффективности электронных и квазиэлектронных предприятий. Total Cost Ownership, Balanced Scorecard 36.5 KB
  в среднем можно ожидать около 5 учитывая что привлекать мы будем именно потенциальных покупателей а не случайных людей. Расчет: Колво покупателей = колво посетителей 100 х конверсии = 240.000 покупателей за 6 месяцев. Валовая прибыль = колво покупателей х средний чек = 12.
27133. Структурированная процесс-модель «бизнес-контент-менеджмент» 1.85 MB
  Структурированная процессмодель бизнесконтентменеджмент Одно из главных требований предъявляемых к построению современного электронного бизнесрешения как можно более быстрая трансформация бизнесидеи в конкретное решение которое соответствует запросам пользователя не требует значительных расходов на поддержку функционирует эффективно и с невысокими издержками и имеет стройную организацию. Структурированная процессмодель дает солидную основу для старта проекта Процессмодель концепция бизнес контент менеджмент состоит из...
27135. Электронная коммерция: B2B. Виртуальные торговые площадки 16.68 KB
  Виртуальные торговые площадки B2B англ. Возможности Интернет позволяют совершать покупки продажи в режиме реального времени и благодаря доступности Интернет в торговой деятельности площадки могут участвовать компании из разных точек земного шара. Площадки типа buyerdriven. В качестве примера можно взять автомобильную промышленность где GM Ford и Daimler Chrysler объединились для создания глобальной онлайновой торговой площадки или здравоохранение где Tenant Healthcare объединила усилия с Ventro ранее Chemdex для создания...
27136. Электронная коммерция: B2C. Интернет-магазины 18.27 KB
  Интернетмагазины. Один из наиболее популярных инструментов B2C это интернетмагазин. Полная автоматизация 3 Продвинутый Advanced торговая интернетсистема. Предполагает что интернетмагазин интегрирован с внутренней информационной системой предприятия ERP система бух.
27137. Электронные платежные системы: основные виды и принцип функционирования 691.91 KB
  Кроме того следует различать виртуальные дебетовые карты выпускаемые некоторыми банками и реальные кредитные и дебетовые карты. Предоплаченные виртуальные дебетовые карты представляют собой полный аналог обычной Visa или подобной карты которую принимают в Интернете. Владельцу сообщают все платёжные реквизиты такой карты и с точки зрения стороннего наблюдателя платёж осуществляется с обычной пластиковой карты. Такую карту легче купить так как выпуск такой карты осуществляется без проверки личности владельца.
27138. Электронные финансовые структуры. Интернет-банкинг, Интернет-страхование, Интернет-трейдинг 17.72 KB
  Интернетбанкинг Интернетстрахование Интернеттрейдинг. Интернетбанкинг это общее название технологий дистанционного банковского обслуживания при котором доступ к счетам и операциям по ним предоставляется в любое время и с любого компьютера имеющего доступ в Интернет. Интернетбанкинг часто доступен по системе банкклиент с использованием технологии тонкого клиента. Как правило услуги интернетбанкинга включают: выписки по счетам предоставление информации по банковским продуктам депозиты кредиты ПИФ и т.
27139. Интернет-маркетинг. Маркетинговые исследования в Интернет. Проблемы конверсии и лояльности 22.07 KB
  Проблемы конверсии и лояльности. Механизмы повышения лояльности в электронном бизнесе. Повышение лояльности клиентов и выполняет эту важную функцию. Именно для этого существуют всевозможные программы повышения лояльности клиентов.