Originariamente inviato da boxer89
io so programmare in java,il linguaggio C è abbastanza simile togliendo qualche struttura e altre differenze...ma quello che nn riesco ancora a capire sono sti maledetti puntatori!!!!!
Se sapessi programmare in Java, dovresti sapere almeno cosa sono i puntatori ed il loro funzionamento visto che esistono (in forma implicita) e vengono usati spesse volte

Originariamente inviato da boxer89
ESERCIZIO 1 (4 punti)
Inserire nei commenti l’output delle istruzioni printf(), immaginando che la funzione
print_ar() stampi il contenuto di tutti gli elementi dell’array:
int int_ar[] = {12,3,5,2};
int *ip, *jp, **kpp;
ip = jp = &int_ar[0];
kpp = &ip;
(*kpp)++;
printf("**kpp = %d\n", **kpp); //____**kpp = 3_______
printf("*++ip = %d\n", *++ip); //____*++ip = 5_______
printf("**kpp = %d\n", **kpp); //____**kpp = 5_______
print_ar(int_ar,4); //____ 12 3 5 2_______
(*(*kpp-1))/=3;
printf("*(*kpp-1) = %d\n", *(*kpp-1)); //____*(*kpp-1) = 1___
print_ar(int_ar,4); //____ 12 1 5 2_______
++jp;
*jp = (**kpp)/2;
printf("**kpp = %d\n", **kpp); //____**kpp = 5_______
printf("*jp = %d\n", *jp); //____*jp = 2_________
int_ar è un array di 4 valori.
ip e jp sono puntatori ad un array monodimensionale, kpp invece ad uno multidimensionale (se viene usato passando al primo operatore [] sempre 0, può puntare anche ad un array monodimensionale, come succede in questo caso).

Con questa assegnazione ip = jp = &int_ar[0]; ip e jp contengono l'indirizzo del primo numero nell'array int_ar (di fatto sono come int_ar), e poi kpp = &ip; da a kpp[0] l'indirizzo di ip quindi è come se ip, jp e kpp[0] siano int_ar.

Con (*kpp)++ incrementa il puntatore dalla posizione 0 alla posizione 1 di int_ar quindi stampa il secondo numero dell'array (3)
Siccome kpp[0] contiene l'indirizzo di ip, incrementando il puntatore kpp, anche ip è stato incrementato, quindi la prossima istruzione
printf("*++ip = %d\n", *++ip); //____*++ip = 5_______
stampa il 3° numero dell'array (5), perchè viene incrementato di nuovo

Sempre per lo stesso discorso, ora stampando
printf("**kpp = %d\n", **kpp); //____**kpp = 5_______
**kpp è 5

Poi con questa istruzione:
print_ar(int_ar,4); //____ 12 3 5 2_______
stampa tutto l'array

Con questa istruzione:
(*(*kpp-1))/=3;
kpp puntava a 5, ha decrementato l'indirizzo di 1, quindi ora punta a 3, prende il valore di quell'indirizzo che è 3 e lo divide per 3.
Poi con il printf esce 1 (3/3 fa 1)

Infatti stampando l'array:
print_ar(int_ar,4); //____ 12 1 5 2_______
al posto di 3 c'è 1