Является ли безопасным отнять от указателя 1 и итерироваться по массиву [1,N], а не [0, N-1]?

В языке C++, нумерация элементов массива начинается с нуля. Это значит, что элементы массива считаются от 0 до N-1, где N - общее количество элементов массива.

Если вы отнимаете 1 от указателя и пытаетесь итерироваться по массиву [1, N], вы нарушаете принципы безопасности языка C++. Дело в том, что указатель должен указывать на допустимое место в памяти, а отнимая от него 1, вы можете выйти за пределы выделенной памяти для массива и обратиться к недоступным или недопустимым областям памяти. Это может привести к непредсказуемому поведению программы, ошибкам времени выполнения и нарушению работы операционной системы.

Кроме того, у вас может быть проблема с доступом к элементу массива. Указатель, указывающий на первый элемент массива, должен быть итерирован с помощью инкремента, а не декремента. Таким образом, правильно итерироваться по массиву будет используя указатель, сдвинутый на 1 вправо:

int* ptr = arr;
for (int i = 1; i <= N; i++) {
    // использование элемента массива, соответствующего указателю
    // ...
    ptr++;
}

Вышеприведенный код предоставляет безопасный способ итерирования по элементам массива [1, N]. При этом указатель будет корректно сдвинут вправо на каждой итерации цикла. Это гарантирует, что вы не превысите границы памяти, выделенной для массива, и сможете получить доступ только к допустимым элементам массива.