Вопрос: Вот изящный трюк: если я пишу
int realarray[10];
int *array = &realarray[-1];,

то теперь можно рассматривать "array" как массив, у которого индекс первого элемента равен единице.

Ответ:
Хотя этот прием внешне привлекателен (и использовался в старых изданиях книги "Numerical Recipes in С"), он не удовлетворяет стандартам С. Арифметические действия над указателями определены лишь тогда, когда указатель ссылается на выделенный блок памяти или на воображаемый завершающий элемент, следующий сразу за блоком. В противном случае поведение программы не определено, даже если указатель не переназначается. Код, приведенный выше, плох тем, что при уменьшении смещения может быть получен неверный адрес (возможно, из-за циклического перехода адреса при пересечении границы сегмента).

Смотри:
ANSI Разд.3.3.6 c. 48;
Rationale Разд.3.2.2.3 c. 38;
K&R II Разд.5.3 c. 100, Разд.5.4 c. 102-3, Разд.A7.7 c. 205-6.
Автор: Кодт    Оценить