/* in questo file sono contenuti alcuni esempi di utilizzo dei puntatori
 * e della loro aritmetica */
#include<stdio.h>


main()
{
float a[10];
char miastringa[]="Fondamenti di Informatica II";
int ii;

struct test{
 int a;
 float pi;
} miastruct;
	
/* esempi di definizione di puntatori */

float *primop,*secondop;
char *charpointer;
struct test * structpointer;
char *altrastringa="I puntatori sono PERICOLOSI!!";


for(ii=0;ii<10;ii++)
    a[ii]=2*ii+1;

/* in pratica: ii  a[ii]
                0     1
                1     3
                2     5 
                3     7
                4     9
                5    11  
                6    13
                7    15
                8    17
                9    19 
*/

/* esempio di assegnazioni */

primop   = &(a[2]);
secondop = &a[9]; /* le parentesi NON sono necessarie */

printf("*primop   = %g\n",* primop); /* 5 */
printf("*secondop = %g\n",* secondop); /* 19 */

/* aritmetica dei puntatori */

printf("secondop-primop    %d\n", secondop-primop); /* 7 */
printf("primop-secondo    %d\n", primop-secondop); /* -7 */

/* altrettanto lecito e' sottrarre/sommare un intero da un puntatore */

printf("*(primop+2) %g\n",*(primop+2)); /* 9 */
printf("*(primop-1) %g\n",*(primop-1)); /* 3 */

/* definire un array significa definire un puntatore ad un'area di memoria
 * preallocata */

printf("*a = %g\n",*a); /* 1 */

/* il fatto che un array sia equivalente ad un puntatore significa
 * poter applicare ad esso l'aritmetica dei puntatori */
ii=5;
printf("*(a+ii)    con ii=5    %g\n", *(a+ii)); /* 11 */
printf("a[ii]      con ii=5    %g\n", a[ii]); /* 11 */
printf("ii[a]      con ii=5    %g\n", ii[a]); /* 11 */

/* esempio di utilizzo dei puntatori con le strutture
 * (l'esempio e' valido anche quando si parla di unioni */

miastruct.pi=3.14f;
structpointer=&miastruct; /* senza specificare i componenti */

printf("structpointer->pi %g\n",structpointer->pi); /* 3.14 */

/* i puntatori sono ampiamente utilizzati per la manipolazione 
 * delle stringhe ad esempio convertiamo la stringa in oggetto in
 * maiuscolo */

for(charpointer=miastringa;*charpointer!=0;charpointer++)
 if(*charpointer>'Z')
   *charpointer-='a'-'A';

printf("%s\n", miastringa);
}