Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19


Download 1.98 Mb.
bet12/53
Sana15.08.2023
Hajmi1.98 Mb.
#1667321
TuriУчебное пособие
1   ...   8   9   10   11   12   13   14   15   ...   53
Bog'liq
Lekcii AiSD 2015

Операции с адресами

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


int *у;

то *у может, как уже было рассмотрено в §2.4. 1, появляться там же, где и любая другая переменная, не являющаяся указателем.


Вполне допустимы выражения:
*у = 7 ; // Запись числа 7 по адресу у
*х *= 5 i // УВеличение значения по адресу х в 5 раз ( * z ) ++ ; // Увеличение на 1 значения по адресу z

Скобки в последнем выражении необходимы, т.к. операции


* и ++ имеют одинаковый приоритет и выполняются справа на- лево. Если * z = 5, то после операции (* z)++ * z 6, а * z++ толь- ко увеличит сам адрес, хранящийся в указателе z .
int *р; // Указатель на тип int int i = 33;
р &і;
*р = *р + 1; // i - 34;

Указатели можно использовать как операнды в арифметиче- ских операциях:


Унарная операция ++ увеличивает его значение, теперь оно является адресом следующего элемента. Указатели и целые числа можно складывать. Конструкция вида
у + п
задает адрес п—го объекта, адресуемого указателем у. Это спра— ведливо для объектов любых стандартных типов ( che г, iпё и т.д.), транслятор будет масштабировать приращение адреса в со- ответствии с типом, определённым из соответствующего объяв- ления. Арифметические операции, выполняемые над указателем и целым значением, имеют осмысленный результат, если указа— тель адресует непрерывный блок памяти, хранящий множество элементов одного типа.

36
Один указатель может быть вычтен из другого, если они указывают на один и тот же тип данных. Разность между двумя указателями преобразуется к знаковому целому значению путем деления разности на длину типа, данные которого адресуются указателями. Результат представляет число ячеек памяти данного типа между двумя адресами.


Поскольку операции ++, ——, * и & имеют одинаковый при- оритет и выполняются справа налево, то нужно внимательно от- носиться к последовательности их выполнения при их сочетани- ях, например, выражение

вычисляется как сначала *, затем ++ и значение указателя увели- чивается на 1. Рассмотрим пример. Пусть имеются некоторые пе- ременные и указатель, над которым последовательно выполняют- ся операции.


int i1=10, i2=20, i3=30;
int *p=&i2;

іЗ

i2

i1

30

20

10

*&i2 -> 20


*&++i2 -> 21
30 231 10

*р -> 21


*р++ -> 21
’Р -* 10
30 21 130

30 21 131

*--р -> 21



Download 1.98 Mb.

Do'stlaringiz bilan baham:
1   ...   8   9   10   11   12   13   14   15   ...   53




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling