Es un interesante ejemplo de apuntadores, empezaré desde el principio para que se entienda mejor y trataré de explicarlo lo mejor que pueda:
p pasa a apuntar a un sector de memoria con tamaño de 100 bytes.
Código:
for(i=0; i<100; i++)
*(p+i)=0;
Se inicializa el sector de memoria a donde apunta p para que todo sea 0, quedando p="\0\0\0..."
Código:
for(i=0; i<5; i++)
ad[i]=p + i* 3;
ad es un arreglo de apuntadores, lo que hace el for es asignar a cada apuntador de ad una posición de p saltando de 3 en 3, quedando así:
ad[0]=p; // ad[0] es igual que p
ad[1]=p+3; // ad[1] apunta a la tercera posición de la memoria asignada para p
ad[2]=p+6; // ad[2] apunta a la sexta posición de la memoria asignada para p
...
Código:
for(i=0; i<5; i++)
gets(ad[i]);
ahora se está obteniendo una cadena para cada apuntador, pero lo que se introduzca será guardado en la memoria que fue asignada para p, saltando de 3 en 3, quedando así:
Código:
primero tenemos que p="\0\0\0..."
ad[0] el usuario introduce "hola" ahora p=="hola\0\0\0..."
ad[1] el usuario introduce "examen" pero ad[1] apunta a la tercera posición de p así que p=="holexamen\0\0\0..."
ad[2] el usuario introduce "el" (ad[2] apunta a p+6) por lo que p=="holexael\0\0\0..."
ad[3] el usuario introduce "struct" (ad[3] == p+9) por lo que p=="holexael\0struct\0\0\0..."
ad[4] el usuario introduce "array" (ad[4] == p+12) por lo que p=="holexael\0strarray\0\0\0..."
por último:
Se está escribiendo el contenido de p según el apuntador ad[1]-1, ad[1] apunta a la tercera posición de la memoria asignada a p pero al restarle 1 al apuntador éste pasa a apuntar a la segunda posición de la memoria, quedando así:
ad[1]-1=="lexael\0strarray\0\0\0..." como hay un \0 antes de "strarray" solo se escribe "lexael"
puedes probar a introducir todas las palabras mayores de 3 letras y así podrás ver como se forma una palabra a partir de las 3 primeras letras de cada palabra dada, excepto de la primera de la cual se usará solo la tercera letra.