int arr[N], *p;
p = arr-1;
このままの流れならマズイ結果になるだけで、

int arr[N], *p;
arr++;
arr++;
p = arr-1;
これなら大丈夫じゃないの。

まあ、
"アドレスの計算だけなら何やっても問題ない全部大丈夫だ"
と同じ理論だけど。
コンパイラも何も言わないと思うよ。

それから
"添え字がマイナス方向の一個はみ出しはCでは認めてないよ。"
配列とポインタ演算をごっちゃにしないように。
arr-1
はポインタ演算