Правильно ли этот код?
int arr[2];
int (*ptr)[2] = (int (*)[2]) &arr[1];
ptr[0][0] = 0;
Очевидно, что ptr[0][1] будет недопустимым, обратившись за пределы arr.
  Примечание. Нет сомнений в том, что ptr[0][0] обозначает ту же ячейку памяти, что и arr[1]; возникает вопрос, разрешено ли нам получать доступ к этому местоположению памяти через ptr. Здесь - еще несколько примеров того, когда выражение обозначает одно и то же место в памяти, но ему не разрешается обращаться к этому месту памяти.
  Примечание 2: Также рассмотрите **ptr = 0;. Как отметил Марк Ван Леувен, ptr[0] эквивалентно *(ptr + 0), однако ptr + 0, похоже, выпадает из-за арифметического раздела указателя. Но используя *ptr вместо этого, этого можно избежать.