y otra duda tambien de un vector de punteros
por ejemplo si tengo
char *meses[3] ={"Enero","Febrero","Marzo"};
for(i=0;i < 3;i++)
aqui me imprime Enero Nero Ero
pero si a la linea del printf le agrego unos parentesis
me imprime correctamente Enero Febrero Marzo
no entiendo por que
Si tu dibujas el mapa de memoria tendrás que lo que el vector se encuentra estructurado así ( cada letra una posición de memoria ):
'E' 'n' 'e' 'r' 'o' '\0' 'F' 'e' 'b' 'r' 'e' 'r' 'o' '\0' 'M' 'a' 'r' 'z' 'o' '\0'
y dado que "meses" es una matriz de cadena de caracteres, se cumple que:
*meses es igual a *meses + 0 y apunta al primer carácter ( 'E' ).
*meses + 1 es un desplazamiento de una posición respecto a *meses, es decir, apunta al segundo carácter ( 'n' )
*meses + 2 es un desplazamiento de dos posiciones respecto a *meses, es decir, apunta al tercer carácter ( 'e' )
...
Es decir, primero resuelves el puntero *meses y luego incrementas la posición apuntada.
Con esto, si intentas imprimir las cadenas resultantes te sale:
Enero, nero, ero, ro, o, (nada), Febrero, ebrero, ...
Sin embargo, *( meses + i ) es equivalente a moverte primero una fila y apuntar al caracter que esté en esa posición, de tal forma que:
*(meses + 0) o *meses apunta a 'E'
*(meses + 1) apunta a 'F'
*(meses + 2) apunta a 'M'
Al final el cambio viene promovido porque los paréntesis cambian el orden en el que se ejecutan las operaciones... no es lo mismo resolver un puntero doble y luego incrementar su posición que incrementar un puntero doble y resolver su posición.