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

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

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






С указателями можно выполнять следующие операции: разадресация, или косвенное обращение к объекту (*), присваивание, сложение с константой, вычитание, инкремент (++), декремент (--), сравнение, приведение типов. При работе с указателями часто используется операция получения адреса (&).

В языке С/С++ допустимы только две арифметические операции над указателями: сложение и вычитание.

Арифметические операции с автоматически учитывают размер типа величин, адресуемых указателям. Эти операции применимы только к указателям одного типа и имеют смысл в основном при работе со структурами данных, последовательно размещенными в памяти, например, с массивами.

long *ptrl; ptrl = 2000; ptrl++; Переменная long занимает в памяти 4 байта. Пусть указатель принимает значение 2000. После операции увеличения указатель ptrl становится равным 2004.
ptrl--; Аналогично, если начальное значение указателя 2000, то после уменьшения указатель становится равным 1996.

Инкремент перемещает указатель к следующему элементу массива, декремент - к предыдущему. Фактически значение указателя изменяется на величину sizeof(тип). Если указатель на определенный тип увеличивается или уменьшается на константу, его значение изменяется на эту величину этой константы, умноженную на рамер объекта данного типа, например:

short * p = new short [5];

p++; //значение p увеличивается на 2

long * q = new long [5];

q++; //значение q увеличивается на 4

Операции адресной арифметики подчиняются следующим правилам.

1) Допустимые операции с указателями – инкремент, декремент, прибавление или вычитание целого числа к указателю.

2) После выполнения операции увеличения над указателем, данный указатель будет ссылаться на следующий объект своего базового класса.

3) После выполнения операции уменьшения над указателем, данный указатель будет ссылаться на предыдущий объект своего базового класса.

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

Пример. Выполнение оператора pi = pi +1; «передвигает» указатель на 1 объект в сторону увеличения адреса. Выполнение pch +=4; «передвигает» указатель на 4 объект в сторону увеличения адреса. В итоге, адреса pi +1 и pch +4 совпадают.

char *pch = (char *)1000;

int *pi = (int *)1000;

    Адрес 1000 Адрес 1004
  pi       pi+1        
                 
      1001            
pch            
    pch+1              
      pch+2            
        pch+3   pch+4      

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

Ещё одна операция – можно вычитать два указателя одного типа. Благодаря этому, можно определить количество объектов, расположенных между адресами, на которые указывают данные указатели.

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

 

При записи выражений с указателями следует обращать внимание на приоритеты операций. В качестве примера рассмотрим последовательность действий заданную в операторе

*p++ = 10;

Операции разадресации и инкремента имеют одинаковый приоритет и выполняются справа налево, но, поскольку инкремент постфиксный, он выполняется после выполнения операции присваивания. Таким образом, сначала по адресу, заданному в указателе p, будет записано значение 10, а затем указатель будет увеличен на количество байт, соответствующее его типу. То же самое можно записать подробнее:

*p = 10; p++;

Выражение (*p)++, напротив, инкрементирует значение, на которое ссылается указатель.







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



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

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

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

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

Тема 2: Анатомо-топографическое строение полостей зубов верхней и нижней челюстей. Полость зуба — это сложная система разветвлений, имеющая разнообразную конфигурацию...

Виды и жанры театрализованных представлений   Проживание бронируется и оплачивается слушателями самостоятельно...

Что происходит при встрече с близнецовым пламенем   Если встреча с родственной душой может произойти достаточно спокойно – то встреча с близнецовым пламенем всегда подобна вспышке...

Решение Постоянные издержки (FC) не зависят от изменения объёма производства, существуют постоянно...

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

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

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