logo
CSharp_Prog_Guide

Арифметические операции над указателями

В этом разделе рассматривается использование арифметических операторов + и - для управления указателями.

Примечание.

Невозможно выполнять арифметические операции над указателями типа "void".

Сложение и вычитание числовых значений из указателей

Можно сложить значение n типа int, uint, long или ulong с указателем p, любого типа, кроме void*. В результате p+n получится указатель, являющийся суммой n * sizeof(p) to the address of p. Аналогично, результатом p-n является указатель, полученный вычитанием n * sizeof(p) из адреса p.

Вычитание указателей

Также можно вычитать указатели одного типа. Тип результата всегда long. Например, если p1 и p2 являются указателями типа pointer-type*, то результат выражения p1-p2 будет следующим:

((long)p1 - (long)p2)/sizeof(pointer_type)

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

Пример

------

Результат

The difference is: 6

Pointer Comparison

You can apply the following operators to compare pointers of any type:

==   !=   <   >   <=   >=

The comparison operators compare the addresses of the two operands as if they are unsigned integers.

Example

// compile with: /unsafe

class CompareOperators

{

unsafe static void Main()

{

int x = 234;

int y = 236;

int* p1 = &x;

int* p2 = &y;

System.Console.WriteLine(p1 < p2);

System.Console.WriteLine(p2 < p1);

}

}

Sample Output

True

False