Recipe 16.2 Comparing Pointers
Problem
You
need to know whether two pointers point to the same memory location.
If they don't, you need to know which of the two
pointers points to a higher or lower element in the same block of
memory.
Solution
Using the == and
!= operators, we can determine if two pointers
point to the same memory location. For example, the code:
unsafe
{
int[] arr = new int[5] {1,2,3,4,5};
fixed(int* ptrArr = &arr[0])
{
int* p1 = (ptrArr + 1);
int* p2 = (ptrArr + 3);
Console.WriteLine("p2 > p1");
Console.WriteLine("(p2 == p1) = " + (p2 == p1));
Console.WriteLine("(p2 != p1) = " + (p2 != p1));
p2 = p1;
Console.WriteLine("p2 == p1");
Console.WriteLine("(p2 == p1) = " + (p2 == p1));
Console.WriteLine("(p2 != p1) = " + (p2 != p1));
}
}
displays the following:
p2 > p1
(p2 == p1) = False
(p2 != p1) = True
p2 == p1
(p2 == p1) = True
(p2 != p1) = False
Using
the
>, <,
>=, or <= comparison
operators, we can determine whether two pointers are pointing to a
higher, lower, or the same element in an array. For example, the
code:
unsafe
{
int[] arr = new int[5] {1,2,3,4,5};
fixed(int* ptrArr = &arr[0])
{
int* p1 = (ptrArr + 1);
int* p2 = (ptrArr + 3);
Console.WriteLine("p2 > p1");
Console.WriteLine("(p2 > p1) = " + (p2 > p1));
Console.WriteLine("(p2 < p1) = " + (p2 < p1));
Console.WriteLine("(p2 >= p1) = " + (p2 >= p1));
Console.WriteLine("(p2 <= p1) = " + (p2 <= p1));
p2 = p1;
Console.WriteLine("p2 == p1");
Console.WriteLine("(p2 > p1) = " + (p2 > p1));
Console.WriteLine("(p2 < p1) = " + (p2 < p1));
Console.WriteLine("(p2 >= p1) = " + (p2 >= p1));
Console.WriteLine("(p2 <= p1) = " + (p2 <= p1));
}
}
displays the following:
p2 > p1
(p2 > p1) = True
(p2 < p1) = False
(p2 >= p1) = True
(p2 <= p1) = False
p2 == p1
(p2 > p1) = False
(p2 < p1) = False
(p2 >= p1) = True
(p2 <= p1) = True
Discussion
When manipulating the addresses that pointers point to, it is
sometimes necessary to compare their addresses. The
==, !=,
>, <,
>=, and <= operators have
been overloaded to operate on pointer type variables. These
comparison operators do not compare the value pointed to by the
pointers; instead, they compare the addresses pointed to by the
pointers.
To compare the values pointed to by two pointers, dereference the
pointers and then use a comparison operator on them. For example:
*intPtr == *intPtr2
or:
structPtr1->value1 != structPtr2->value1
will compare the values pointed to by these pointers, rather than
their addresses.
See Also
See the "C# Operators,"
"= = Operator," and
"! = Operator" topics in the MSDN
documentation.
|