Адресная арифметика
Под адресной арифметикой (или арифметикой над указателями) понимаются действия над указателями, связанные с использованием адресов памяти. Рассмотрим основные операции, которые можно применять к указателям, а какие – нельзя.
Операция адреса
Так как указатель – это переменная, то для получения адреса памяти, где расположен указатель, можно использовать операцию адреса (&):
int * p, x = 5; p = &x;
cout<<&x<<&p<<endl;
Операция присваивания
Указателю можно присвоить адрес переменной
p = &x, где p – указатель, x – имя переменной.
Указатели можно присваивать один другому, если оба указателя одного типа:
int x = 5; int * p = &x;
int * q = p;
cout<<*p<<' '<<*q<<endl; // 5 5
Операция разыменования
Определение значения, на которое ссылается указатель p:
int * p, n, m = 5;
p = &m; // p присвоен адрес переменной m
n = * p; // переменная n примет значение 5
*p = -13; // переменная m примет значение -13
4. Увеличение/уменьшение указателя
Основными арифметическими операциями, применимыми к указателям, являются операции увеличения и уменьшения указателя:
имя_указателя + i и имя_указателя – i, где
имя_указателя – переменная типа указатель; i – значение типа int.
Результатом операции имя_указателя+ i является указатель на i-й элемент после элемента, адрес которого находится в данном указателе, а имя_указателя- i – указатель на i-й элемент до элемента, адрес которого находится в данном указателе.
double d,*p; int n;
p = &d;
n = 3; p = p + n; // в p адрес увеличился на 24
p =n + p; // в p адрес увеличился ещё на 24
Если к указателю применяется операция инкремента (++) или операция декремента (--), то значение указателя увеличивается или уменьшается на размер данных, которые он адресует.
long b;
long * p; // p – указатель на тип long
p = &b; // в p адрес переменной b
p++; // в p адрес увеличится на 4
p--; // в p адрес уменьшится на 4
Вычитание указателей
При работе с указателями можно использовать операцию вычитания двух указателей:
имя_указателя1 – имя_указателя2
Операция имеет смысл, только если обе переменные являются указателями на один и тот же набор данных (например, массив). Результатом операции является целое число, которое показывает сколько элементов соответствующего типа можно расположить между адресами памяти, на которые указывают указатели имя_указателя1, имя_указателя2.
Операции сравнения
Указатели на данные одного и того же типа можно сравнивать с помощью обычных операций сравнения: ==, !=, >, >=, <, <=.
При сравнении указателей сравниваются их значения (хранимые в них адреса), а не значения величин, на которые данные указатели указывают. Результатом операций сравнения является целое число (0 или 1).
Сравнение указателей с числовыми значениями как сравнение данных разных типов не определено.
Операция sizeof
Для определения, сколько байтов отводится под указатель, можно использовать операцию sizeof(указатель). Количество байтов зависит от модели памяти (обычно 4 байта).
Дата добавления: 2022-05-27; просмотров: 77;