Aritmética de puntero y matrices: ¿qué es realmente legal?

Considere las siguientes declaraciones:

int    *pFarr, *pVarr;

int    farr[3] = {11,22,33};
int    varr[3] = {7,8,9};

pFarr = &(farr[0]);
pVarr = varr;

En esta etapa, ambos punteros apuntan al comienzo de cada dirección de matriz respectiva. Para * pFarr, actualmente estamos viendo 11 y para * pVarr, 7.

Igualmente, si solicito el contenido de cada matriz a través de * farr y * varr, también obtengo 11 y 7.

Hasta aquí todo bien.

Ahora intentemospFarr++ ypVarr++. Excelente. Ahora estamos viendo 22 y 8, como se esperaba.

Pero ahora...

Tratando de subirfarr++ yvarr++ ... y obtenemos "tipo de argumento incorrecto para incrementar".

Ahora, reconozco la diferencia entre un puntero de matriz y un puntero regular, pero dado que su comportamiento es similar, ¿por qué esta limitación?

Esto me confunde aún más cuando también considero que en el mismo programa puedo llamar a la siguiente función de una manera aparentemente correcta y de otra manera incorrecta, y obtengo el mismo comportamiento, aunque en contraste con lo que sucedió en el código publicado anteriormente !?

working_on_pointers ( pFarr, farr );  // calling with expected parameters
working_on_pointers ( farr, pFarr );  // calling with inverted parameters 

.

void working_on_pointers ( int *pExpect, int aExpect[] ) {

    printf("%i", *pExpect);  // displays the contents of pExpect ok
    printf("%i", *aExpect);  // displays the contents of aExpect ok

    pExpect++;               // no warnings or errors
    aExpect++;               // no warnings or errors

    printf("%i", *pExpect);  // displays the next element or an overflow element (with no errors)
    printf("%i", *aExpect);  // displays the next element or an overflow element (with no errors)

}

¿Podría alguien ayudarme a comprender por qué los punteros de matriz y los punteros se comportan de manera similar en algunos contextos, pero diferentes en otros?

Muchas gracias.

EDITAR: Noobs como yo podría beneficiarse aún más de este recurso:http://www.panix.com/~elflord/cpp/gotchas/index.shtml

Respuestas a la pregunta(6)

Su respuesta a la pregunta