Увеличение и уменьшение указателей



Используйте операторы увеличения и уменьшения, ++ и --, для изменения положения указателя на значение sizeof (pointer-type) применительно к указателю, имеющему тип "тип указателя*". Выражения увеличения и уменьшения принимают следующую форму:

++p; P++; --p; p--;

Операторы увеличения и уменьшения можно применять к указателям любого типа, кроме типа void*.

Результатом применения оператора увеличения к указателю типа pointer-type является добавление значения sizeof (pointer-type) к адресу, содержащемуся в переменной указателя.

Результатом применения оператора уменьшения к указателю типа pointer-type является вычитание значения sizeof (pointer-type) из адреса, содержащегося в переменной указателя.

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

Пример

В этом примере выполняется перемещение по массиву путем увеличения значения переменной указателя на размер типа int. После выполнения каждого шага отображается адрес и содержимое элемента массива.

ß--------


Arithmetic Operations on Pointers

This topic discusses using the arithmetic operators + and - to manipulate pointers.

Note:
You cannot perform any arithmetic operations on void pointers.

Adding and Subtracting Numeric Values to or From Pointers

You can add a value n of type int, uint, long, or ulong to a pointer, p,of any type except void*. The result p+n is the pointer resulting from adding n * sizeof(p) to the address of p. Similarly, p-n is the pointer resulting from subtracting n * sizeof(p) from the address of p.

Subtracting Pointers

You can also subtract pointers of the same type. The result is always of the type long. For example, if p1 and p2 are pointers of the type pointer-type*, then the expression p1-p2 results in:

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

No exceptions are generated when the arithmetic operation overflows the domain of the pointer, and the result depends on the implementation.

Example

// compile with: /unsafe
class PointerArithmetic { unsafe static void Main() {    int* memory = stackalloc int[30];    long* difference;    int* p1 = &memory[4];    int* p2 = &memory[10];      difference = (long*)(p2 - p1);      System.Console.WriteLine("The difference is: {0}", (long)difference); } }

Output

The difference is: 6

 


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

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

Примечание.
Невозможно выполнять арифметические операции над указателями типа "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

 


Сравнение указателей

Для сравнения указателей любого типа можно использовать следующие операторы:

== != < > <= >=

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

Пример

ß-------

 

Пример результатов выполнения[46]

True

False

 


Дата добавления: 2019-03-09; просмотров: 238; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!