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