// massimoFunzionale3.c
// ESERCIZIO: passaggio parametri per indirizzo
// Una procedura puo' cambiare delle celle FUORI da essa
// se gli si passa l'INDIRIZZO DELLA VARIABILE

#include <stdio.h>
#include <stdlib.h>
#define	LUN 3

int main()
{
   int	num;	// dichiarazione delle variabili
   int	i;
   int	massimo;
   int	numeri[LUN];
   void calcolaMassimo(int numeri[], int * DammiIndirizzoDelMassimo); 
   // Questa e' una PROCEDURA !!!
	
   // solita immissione di un array
   for (i = 0; i < LUN; i = i + 1)
   {
      scanf("%d", &num);
      numeri[i] = num;
   }

   // punto A
   // 2. inserisci delle printf nel codice che stampano 
   // a monitor le seguenti variabili: numeri massimo &massimo
   printf("\nIndirizzo del vettore numeri: %d", numeri);
   printf("\nValore della variabile massimo: %d", massimo);
   printf("\nIndirizzo della variabile massimo: %d", &massimo);
   
   calcolaMassimo(numeri, & massimo);  
   printf("\nmassimo=%d\n", massimo);

   fflush(stdin);
   getchar(); // non serve a nulla ma ferma la finestra...
   exit(0);
}

void calcolaMassimo(int numeri[], int * DammiIndirizzoDelMassimo)
{
   int massimoLocale;
   int i;  // vedo solo le variabili che vengono passate 
           //e quelle dichiarate 
           // quindi vedo e uso "massimoLocale" e "i"
           // l'indirizzo dove inizia l'array "numeri" passato
			
   // punto B
   // 3. inserisci delle printf nel codice che stampano a monitor le  seguenti 
   // variabili: numeri DammiIndirizzoDelMassimo *DammiIndirizzoDelMassimo
   printf("\nIndirizzo del vettore numeri: %d", numeri);
   printf("\nIndirizzo contenuto nella variabile DammiIndirizzoDelMassimo: %d", DammiIndirizzoDelMassimo);
   printf("\nValore della variabile puntata da DammiIndirizzoDelMassimo: %d\n", *DammiIndirizzoDelMassimo);
		
   // 4. esamina i valori degli indirizzi di memoria che hai stampato a consolle
   // e prova a fare uno schema su carta della memoria;
   // 5. stampa l'indirizzo &DammiIndirizzoDelMassimo e verifica la coerenza 
   // con lo schema della memoria che hai disegnato su carta; 
   printf("\nIndirizzo della variabile DammiIndirizzoDelMassimo: %d",&DammiIndirizzoDelMassimo);
	
   // 6. inserisci una printf che visualizza il valore della variabile massimo. 
   // Che valore viene visualizzato?
   
   printf("\n\nValore contenuto nella variabile massimoLocale: %d\n", massimoLocale);
   // ATTENZIONE: non posso stampare la variabile massimo perche' e' dichiarate nel main!
   // nella funzione posso vedere solo la variabile massimoLocale
	
   massimoLocale = numeri[0];	
   for (i = 0; i < LUN; i = i + 1)
   {
      if (massimoLocale < numeri[i])
      {
         massimoLocale = numeri[i];
      }
   }
   *DammiIndirizzoDelMassimo= massimoLocale;
   // il valore della variabile LOCALE "massimoLocale" (che andrebbe persa 
   // due righe sotto, alla chiusura della procedura) viene 
   // copiato nella cella di indirizzo "DammiIndirizzoDelMassimo".
   // "DammiIndirizzoDelMassimo" contiene infatti l'indirizzo (esterno
   // alla memoria che puo' vedere la procedura) della variabile massimo
   // infatti chiamammo nel main: "calcolaMassimo(numeri, &massimo);"
}