В разделе §6.5.8 реляционные операторы, стандарт C11 (ISO/IEC 9899: 2011) говорит:
При сравнении двух указателей результат зависит от относительных местоположений в адресном пространстве объектов, на которые указывает. Если два указателя на типы объектов указывают на один и тот же объект или оба указывают один за последним элементом одного и того же объекта массива, они сравнивают равные. Если объекты, на которые указывают, являются членами одного и того же совокупного объекта, указатели на элементы структуры, объявленные позже, сравниваются больше, чем указатели на элементы, объявленные ранее в структуре, а указатели на элементы массива с большими значениями индекса сравниваются больше, чем указатели на элементы одного и того же массива с нижними значениями индекса. Все указатели на члены одного и того же объекта объединения сравниваются одинаково. Если выражение P
указывает на элемент объекта массива, а выражение Q
указывает на последний элемент того же объекта массива, выражение указателя Q+1
сравнивает более P
. Во всех остальных случаях поведение не определено.
Если вы знаете, что указатель находится в пределах диапазона массива, то работают сравнения. Если указатель находится за пределами диапазона, вы не можете быть уверены, что сравнения будут работать. На практике это обычно делается, но стандарт явно говорит о том, что сравнение дает неопределенное поведение.
Обратите внимание, что для массива SomeType array[20];
, адрес &array[20]
гарантированно будет действительным и надежно сравнить с любым адресом из &array[0]
через &array[19]
. Вам нужно решить, хотите ли вы считать это как находящийся в вашем массиве.
В соответствии с замечанием, что стандарт не гарантирует, что он будет работать, то вы можете сравнить два int
указателей:
int within_int_array(int *array, size_t num_ints, int *ptr)
{
return ptr >= array && ptr < array + num_ints;
}
В эти дни, вы должны быть более осторожным о вызове к неопределенному поведению. Компиляторы делают неприятные вещи для программ, которые используют неопределенное поведение, и технически, у вас нет возможности использовать средства, поскольку в стандарте указано «неопределенное поведение».
Возможно, есть еще один вопрос, задающий этот вопрос. Сорта. Стандарт не говорит, что это сработает, но если вы знаете начало массива, количество элементов и размер каждого элемента, а также указатель, который вы указали, тогда вы можете определить, находится ли данный указатель между начало и конец массива.Проблема в том, что если указатель находится за пределами диапазона, сравнения не гарантируются работой стандарта, хотя чаще всего в эти дни, на несегментированных машинах (большинство из них), на самом деле это работает. –
Если вы имеете дело с массивами, почему бы не получить смещения? Я имею в виду, простое целое число, которое будет использоваться в качестве индекса. Таким образом, вы можете сэкономить на проверке принадлежности. –