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

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

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





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

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

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

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; просмотров: 591. Нарушение авторских прав; Мы поможем в написании вашей работы!




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


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


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


Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

ФАКТОРЫ, ВЛИЯЮЩИЕ НА ИЗНОС ДЕТАЛЕЙ, И МЕТОДЫ СНИЖЕНИИ СКОРОСТИ ИЗНАШИВАНИЯ Кроме названных причин разрушений и износов, знание которых можно использовать в системе технического обслуживания и ремонта машин для повышения их долговечности, немаловажное значение имеют знания о причинах разрушения деталей в результате старения...

Различие эмпиризма и рационализма Родоначальником эмпиризма стал английский философ Ф. Бэкон. Основной тезис эмпиризма гласит: в разуме нет ничего такого...

Индекс гингивита (PMA) (Schour, Massler, 1948) Для оценки тяжести гингивита (а в последующем и ре­гистрации динамики процесса) используют папиллярно-маргинально-альвеолярный индекс (РМА)...

Психолого-педагогическая характеристика студенческой группы   Характеристика группы составляется по 407 группе очного отделения зооинженерного факультета, бакалавриата по направлению «Биология» РГАУ-МСХА имени К...

Общая и профессиональная культура педагога: сущность, специфика, взаимосвязь Педагогическая культура- часть общечеловеческих культуры, в которой запечатлил духовные и материальные ценности образования и воспитания, осуществляя образовательно-воспитательный процесс...

Устройство рабочих органов мясорубки Независимо от марки мясорубки и её технических характеристик, все они имеют принципиально одинаковые устройства...

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