Учитывая, что оба указателя указывают на один и тот же массив - и только потом - их можно сравнивать друг с другом. Однако, если вы перейдете на 1 элемент ниже массива, вы выйдете за границы, и это будет неопределенным поведением, даже если вы не получите к нему доступ.
Чтобы разрешить подобный код, C имеет специальное правило, которое позволяет вам иметь указатель 1 элемент за пределами массива, и это безопасно, если вы не отмените ссылку на этот элемент. указатель, когда он указывает на 1 элемент.
Это означает, что вы должны написать цикл с повышением, а не с понижением. Довольно каноническим примером этого будет:
thing* begin = thing_array;
thing* end = thing_array + size; // point 1 past the last valid item
for(thing* i = begin; i != end; i++)
{
do_stuff(i);
}
Например, именно так работает класс контейнера C ++ ::iterator
.
Если вам действительно нужно выполнить итерацию с конца до начала, я бы порекомендовал целочисленный итератор:
for(size_t i=0; i<size; i++)
{
do_stuff(thing_array[size-i-1]);
}