considere las siguientes afirmaciones:Aritmética de punteros y matrices: ¿qué es realmente legal?
int *pFarr, *pVarr;
int farr[3] = {11,22,33};
int varr[3] = {7,8,9};
pFarr = &(farr[0]);
pVarr = varr;
En esta etapa, los dos punteros apuntan al inicio de cada dirección respectiva distribución. Para * Pfarr, actualmente estamos buscando a las 11 y para pVarr *, 7.
Igualmente, si solicito el contenido de cada matriz a través * * Farr y Varr, también tengo 11 y 7.
Así muy bien.
Ahora, probemos pFarr++
y pVarr++
. Estupendo. Ahora estamos viendo 22 y 8, como se esperaba.
Pero ahora ...
Tratando de moverse hacia arriba y farr++
varr++
... y obtenemos "tipo incorrecto de argumentos para incrementar".
Ahora, reconozco la diferencia entre un puntero de matriz y un puntero normal, pero dado que su comportamiento es similar, ¿por qué esta limitación?
Esto me resulta aún más confuso 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 arriba?
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 entender por qué los punteros de la matriz y los punteros se comportan de manera similar en algunos contextos, pero diferentes en otros?
Muchas gracias.
EDIT: Noobs como yo podrían beneficiarse más de este recurso: http://www.panix.com/~elflord/cpp/gotchas/index.shtml
' Tratar de moverse hacia arriba y Farr ++ ++ Varr ... y obtenemos" tipo incorrecto de argumento para aumentar, incrementando de una matriz no está permitido, es todo. Y no necesita el paréntesis en & (farr [0]);) ¡Los punteros son __NOT__ arrays! –
"Reconozco la diferencia entre un puntero de matriz y un puntero normal". Aparentemente, tu no. No existe el "puntero de matriz". Array no es un puntero, punto. No puedes incrementar una matriz. – AnT
esto es cierto. sin embargo, cuando se considera que el compilador reduce las matrices entrantes a los punteros dentro de las funciones, entonces se puede ver cómo un novato pensaría que se estaba incrementando una matriz, cuando en realidad era un puntero. – bitcruncher