«

»

C++. Указатели. Операции над адресами

Над адресами в C++ определены следующие арифметические операции:

  • сложение и вычитание указателей с константой;
  • вычитание одного указателя из другого;
  • инкремент;
  • декремент.

Сложение и вычитание указателей с константой n означает, что указатель перемещается по ячейкам памяти на столько байт, сколько занимает n переменных того типа, на который он указывает. Допустим, что указатель имеет символьный тип и его значение равно 100. Результат сложения этого указателя с единицей — 101, так как для хранения переменной типа char требуется 1 байт. Если же значение указателя равно 100, но он имеет целочисленный тип, то результат его сложения с единицей будет составлять 104, так как для переменной типа int отводится 4 байта.

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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
//Объявление массива из 10 элементов
double mas[10]={1.29, 3.23, 7.98, 5.54, 8.32, 2.48, 7.1};
//Объявление указателя на double
double *p1;
//Присвоение указателю адреса нулевого элемента массива
p1=&mas[0];
//Вывод на экран знчения нулевого элемента массива
cout<<*p1<<endl;
//Увеличение значения адреса на 3*8 (размер типа double)=24,
//в результате сместится на три ячейки, размером double каждая
p1=p1+3;
//Вывод на экран значения третьего элемента массива
cout<<*p1<<endl;
system("pause");
return 0;
}

 

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

Инкремент перемещает указатель к следующему элементу массива, а декремент  к предыдущему:

 

1
2
3
4
5
6
double *p1;
float *p2;
int *i, n;
p1++; //Увеличение значения адреса на 8.
p2++; //Увеличение значения адреса на 4.
i++; //Увеличение значения адреса на 4.

 

К указателям так же применимы операции отношения ==, !=, <,>,<=,>=. Иными словами, указатели можно сравнивать. Например, если i указывает на пятый элемент массива, а j — на первый, то отношение i>j истинно. Кроме того, любой указатель можно сравнивать на равенство с нулем. Однако, все эти утверждения верны, если речь идет об указателях, ссылающихся на один массив. В противном случае результат арифметических операций и операций отношения будет не определен.

1 комментарий

  1. Максим

    Достойная статья)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вы можете использовать эти теги HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Проверка на человечность *