A aritmética de ponteiro ainda funciona fora da matriz?

Eu estou sempre lendo que a aritmética de ponteiro é definida desde que você não deixe os limites da matriz. Não tenho certeza se entendi completamente o que isso significa e fiquei um pouco preocupado. Daí esta questão.

Suponha que eu comece com um ponteiro para o começo de um array:

int *p = (int*) malloc(4 * sizeof(int));

Agora eu crio dois novos ponteiros que estão fora dos limites da matriz:

int *q = p + 10;
int *r = p - 2;

Agora os ponteirosq-10, q-9...r+2, r+3e assim por diante todos estão dentro dos limites da matriz. Eles são válidos? Por exemplo, ér[3] garantido para dar o mesmo resultadop[1]?

Eu fiz alguns testes e funciona. Mas eu quero saber se isso é coberto pelas especificações C habituais. Especificamente, estou usando o Visual Studio 2010, o Windows e estou programando em C nativo (não em C ++). Eu estou coberto?

questionAnswers(3)

yourAnswerToTheQuestion