Правильно ли этот код?
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
вместо этого, этого можно избежать.