Funzioni in C Passaggio di parametri per indirizzo

  • Slides: 8
Download presentation
Funzioni in C++ Passaggio di parametri per indirizzo

Funzioni in C++ Passaggio di parametri per indirizzo

Passaggio di parametri per indirizzo Il passaggio di parametri per indirizzo (o per riferimento)

Passaggio di parametri per indirizzo Il passaggio di parametri per indirizzo (o per riferimento) passa alla funzione l’indirizzo di memoria del parametro anziché il valore. Non ci sono quindi variabili distinte, una nel main ed una nella funzione, ma la funzione opera sulla stessa area di memoria del main. Data la variabile intera A per sapere qual è l’indirizzo di memoria di A si usa l’operatore &. Osserviamo le istruzioni seguenti: int A; A=5; cout <<“A vale ”<<A <<endl; cout <<“L’indirizzo di A vale ”<<&A<<endl; 28 ff 44 A 5 Sullo schermo viene prodotto: A vale 5 L’indirizzo di A vale 0 x 28 ff 44 Che significa che la variabile A è allocata all’indirizzo di memoria 28 ff 44 che è espresso in base 16 (0 x) 2

Passaggio di parametri per indirizzo Vediamo il seguente esempio in cui la funzione “aggiungi”

Passaggio di parametri per indirizzo Vediamo il seguente esempio in cui la funzione “aggiungi” aggiunge 1 ai due parametri ricevuti. Il primo parametro viene passato per valore il secondo per indirizzo. void aggiungi(int, int &); int main() { int a, b; a=0; b=5; aggiungi(a, b); cout<<“nel main a vale”<<a; cout<<“nel main b vale”<<b; } void aggiungi(int x, int &y) {x++; y++; cout<<“nella funzione x vale”<<x; cout<<“nella funzione y vale”<<y; } RAM MAIN FUNZIONE a b x 0 / 5 6 /0 y 1 Schermo nella funzione: x vale 1 nella funzione: y vale 6 nel main: a vale 0 nel main: b vale 6 3

Passaggio di parametri per valore /* Scambio del valore di due variabili mediante valore

Passaggio di parametri per valore /* Scambio del valore di due variabili mediante valore */ #include <iostream> using namespace std; /* Scambio riceve due parametri di tipo float */ void Scambio(float , float ); // prototipo RAM MAIN var 1 FUNZIONE var 2 x y 3. 14 1. 41 3. 14 / 1. 41 / int main() 1. 41 3. 14 { float var 1 = 3. 14, var 2 = 1. 41; // variabili locali cout << "Prima dello scambio: var 1 = " << var 1 << " var 2 = " << var 2 << endl; // A Scambio sono passati i valori contenuti in var 1 e var 2 3. 14 temp 3. 14 Scambio (var 1, var 2); // chiamata di funzione cout << "Dopo lo scambio. . : var 1 = " << var 1 << " var 2 = " << var 2 << endl; } // Funzione Scambio che effettua lo scambio void Scambio(float x, float y) { float temp = x; x = y; y = temp; } Schermo Prima dello scambio. . : var 1 = 3. 14 var 2 = 1. 41 Dopo lo scambio. . : var 1 = 3. 14 var 2 = 1. 41 4

Passaggio di parametri per indirizzo /* Scambio del valore di due variabili mediante indirizzo

Passaggio di parametri per indirizzo /* Scambio del valore di due variabili mediante indirizzo */ #include <iostream> using namespace std; MAIN /* Scambio riceve due reference a variabili di tipo float */ var 1 void Scambio(float &, float &); // prototipo / 3. 14 RAM FUNZIONE var 2 / x y 1. 41 int main() 1. 41 3. 14 { float var 1 = 3. 14, var 2 = 1. 41; // variabili locali cout << "Prima dello scambio: var 1 = " << var 1 << " var 2 = " << var 2 << endl; // A Scambio sono passati gli indirizzi a var 1 e var 2 temp 3. 14 Scambio (var 1, var 2); // chiamata di funzione cout << "Dopo lo scambio. . : var 1 = " << var 1 << " var 2 = " << var 2 << endl; } // Funzione Scambio che effettua lo scambio void Scambio(float &x, float &y) { float temp = x; x = y; y = temp; } Schermo Prima dello scambio. . : var 1 = 3. 14 var 2 = 1. 41 Dopo lo scambio. . : var 1 = 1. 41 var 2 = 3. 14 5

Passaggio di parametri con i vettori Nel caso dei vettori l’indirizzo di memoria in

Passaggio di parametri con i vettori Nel caso dei vettori l’indirizzo di memoria in cui il vettore è allocato è indicato con il nome del vettore. Nel caso dei vettori il passaggio di parametri per indirizzo è l’unico utilizzabile 6

ESERCIZIO: diagramma di struttura Risolviamo il seguente problema: Date le altezze di 30 alunni

ESERCIZIO: diagramma di struttura Risolviamo il seguente problema: Date le altezze di 30 alunni di una classe, calcolare l’altezza media e stabilire quanti sono gli alunni che superano la media Altezze degli alunni di una classe Inserire le altezze in un vettore Calcolare la media delle altezze Contare quanti alunni superano la media 7

SOLUZIONE ESERCIZIO: programma // prototipi delle funzioni void inserisci(int v[], int); float calcolamedia(int v[],

SOLUZIONE ESERCIZIO: programma // prototipi delle funzioni void inserisci(int v[], int); float calcolamedia(int v[], int); void contaaltezze(int v[], int, float); int main() { int const max=30; int vett[max]; float media; inserisci(vett, max); media=calcolamedia(vett, max); contaaltezze(vett, max, media); } void inserisci(int v[], int dim) // carico il vettore { for (int i=0; i<dim; i++) {cout<<"ndigita un elemento del vettore "; cin>>v[i]; } } float calcolamedia(int v[], int dim) //calcolo la media {float s, m; for (int i=0; i<dim; i++) s=s+v[i]; m=s/dim; cout<<"nla media e' "<<m; return m; } void contaaltezze(int v[], int dim, float m) //calcolo le altezze {int conta=0; for (int i=0; i<dim; i++) { if (v[i]>m) conta++; } cout<<"ngli alunni che superano la media sono "<<conta; } 8 8