Eu sempre presumi que o &
operador fornece o endereço da memória para a qual uma variável está apontando. Atualmente, estou olhando a documentação padrão do MPI e encontrei o seguinte, que me confundiu.
no entanto, essa expressão de cast & é um ponteiro, não um endereço. O ISO C não exige que o valor de um ponteiro (ou o ponteiro convertido para int) seja o endereço absoluto do objeto apontado --- embora esse seja comumente o caso
Na prática, ponteiros são endereços (exceto talvez em algumas plataformas muito obscuras), mas há restrições adicionais associadas a eles (os compiladores podem otimizar com a suposição de que você não faça certas coisas, por exemplo, não viole o aliasing estrito).
A maneira como os padrões C/C++ documentam essas restrições é explicando os ponteiros como algumas entidades abstratas (sem mencionar endereços) e documentando quais operações são permitidas neles (um subconjunto do que você poderia fazer se fossem apenas endereços).
Algumas pessoas realmente gostam de dizer "ponteiros não são endereços!" para destacar a existência dessas restrições adicionais, mas essa é uma maneira um tanto confusa de colocar isso, e eu prefiro o modelo mental "endereços com algumas restrições".