(*V)[1]
действительно эквивалентно *(*V+1)
.
Поскольку V
равно &p
(при инициализации), *V
равно p
. Итак, у нас есть *(p+1)
.
Обратите внимание, что и *V
, и p
имеют тип int *
. Они указывают на int
, поэтому p+1
указывает на «следующий» int
.
Так как p
указывает на B
(при инициализации), а B
является единственным int
, p+1
точек сразу после конца B
(где было бы «следующее целое», если бы у нас был массив int
вместо одного int
).
This «Только после конца B
» разрешено указатель, и это место, к которому ваш источник относится для решения, (*V)[1]
эффективно добавляет четыре байта к местоположению, на которое указывает *V
.
Однако, хотя разрешено ссылаться на один конец после B
, стандарт C не определяет поведение попытки доступа к объекту там. (*V+1)
является определенным указателем, но *(*V+1)
не является определенным выражением для объекта в этом месте. Его поведение не определяется стандартом C.