DekGenius.com
[ Team LiB ] Previous Section Next Section

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.

    [ Team LiB ] Previous Section Next Section