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

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

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






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

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

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

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



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

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

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

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

ИГРЫ НА ТАКТИЛЬНОЕ ВЗАИМОДЕЙСТВИЕ Методические рекомендации по проведению игр на тактильное взаимодействие...

Реформы П.А.Столыпина Сегодня уже никто не сомневается в том, что экономическая политика П...

Виды нарушений опорно-двигательного аппарата у детей В общеупотребительном значении нарушение опорно-двигательного аппарата (ОДА) идентифицируется с нарушениями двигательных функций и определенными органическими поражениями (дефектами)...

Разработка товарной и ценовой стратегии фирмы на российском рынке хлебопродуктов В начале 1994 г. английская фирма МОНО совместно с бельгийской ПЮРАТОС приняла решение о начале совместного проекта на российском рынке. Эти фирмы ведут деятельность в сопредельных сферах производства хлебопродуктов. МОНО – крупнейший в Великобритании...

ОПРЕДЕЛЕНИЕ ЦЕНТРА ТЯЖЕСТИ ПЛОСКОЙ ФИГУРЫ Сила, с которой тело притягивается к Земле, называется силой тяжести...

СПИД: морально-этические проблемы Среди тысяч заболеваний совершенно особое, даже исключительное, место занимает ВИЧ-инфекция...

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