Потому что все в стране указателей связано со смещением. Когда вы говорите:
int array[10];
array[7] = 42;
То, что вы на самом деле говорите во второй строке:
*( &array[0] + 7 ) = 42;
Буквально переводится как:
* = "what's at"
(
& = "the address of"
array[0] = "the first slot in array"
plus 7
)
set that thing to 42
И если мы можем добавить 7, чтобы сместить точку в нужном месте, мы должны иметь возможность установить противоположное, иначе у нас не будет симметрии в нашей математике. Если:
&array[0] + 7 == &array[7]
Тогда для здравомыслия и симметрии:
&array[7] - &array[0] == 7