// 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);" }