Страницы

Поиск по вопросам

среда, 31 октября 2018 г.

арифметика указателей

Вопрос по поводу арифметики указателей С. Пусть
int *p; int *q; int *o; int i; o = NULL;
Допустим p и q указывают на разные элементы одного массива. Допустимы выражения (i, естественно, где-то определено):
p+i; q-i; p-q;
А допустимо ли:
p-o; o-p;
И что получится, если допустимы? Т.е. с одной стороны o не указывает на тот же массив и вроде нет, но он же равен и обычному 0, и первое вроде бы да.


Ответ

Нет, не допустимы
Стандарт С++ говорит (С++11 [expr.add]p6), что если два указателя не принадлежат одному массиву, то поведение не определено.
Результат вычитания двух указателей - это количество элементов между ними. Если p не выровнен на sizeof(int), то выражение p-o должно вернуть дробное количество элементов, чего не может быть.
При этом выражение p-NULL может быть валидно только если NULL - это #define NULL 0, и не валидно если, например, NULL определено как (void*)0 (в Си). Поскольку стандарт не говорит как именно должен быть определен NULL, то следует считать, что выражение p-NULL не валидно.
Примечание: выражение p-0 валидно и равно p, но это работает только для целого числа 0

Комментариев нет:

Отправить комментарий