Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di...
Transcript of Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di...
![Page 1: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/1.jpg)
Corso di Informatica 2009-2010 Lezione 11 1
Corso di Informatica A.A. 2009- 2010Corso di Informatica A.A. 2009- 2010
Lezione 11
![Page 2: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/2.jpg)
Utilizzo dei puntatoriUtilizzo dei puntatori
• Funzioni
![Page 3: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/3.jpg)
Corso di Informatica 2009-2010 Lezione 11 3
Perche’ i Puntatori ?
I puntatori hanno tre importanti applicazioni:
1. Passaggio di argomenti a funzioni;
2. Allocazione dinamica della memoria;
3. Organizzazione delle Strutture dati (liste, alberi, etc..);
![Page 4: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/4.jpg)
Corso di Informatica 2009-2010 Lezione 11 4
Parametri Formali e Reali#include <stdio.h>/* prototipi delle funzioni */int Somma(int, int);
main(){/*Dichiarazione variabili e costanti*/int a,b,somma;
printf(“\n Inserire due numeri interi:");scanf("%d %d", &a, &b);somma = Somma(a,b);printf(“La somma e’ %d",somma);}
dichiarazionedella funzione:prototipo.Notare che bastaindicare il tipodelle variabili
parametri reali:
“actual parameters”
![Page 5: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/5.jpg)
Corso di Informatica 2009-2010 Lezione 11 5
Passaggio di parametri ad unafunzione
Perche’ questa distinzione fra parametri formali e reali?
Quando un singolo valore e’ passato ad un funzione attraversoun argomento reale, il valore dell’argomento reale e’ copiatonell’argomento formale della funzione: solo il valore di unargomento formale puo’ quindi essere alterato all’interno dellafunzione.
Questo meccanismo per il passaggio di parametri e’detto passaggio per valore (passing by value).
![Page 6: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/6.jpg)
Corso di Informatica 2009-2010 Lezione 11 6
Passing by value: esempio#include <stdio.h>void Modify(int a){ a += 10; printf(“\n Valore del Parametro Formale: %d“, a);}
main(){ int a = 5;
Modify(a); printf(“\n Valore del Parametro attuale: %d“, a);}
Notate che la funzione non ritorna un valore (void) ed il return none’ specificato. Manca inoltre il prototipo poiche’ il corpo dellafunzione e’ inserito prima dell’utilizzo della funzione stessa.
![Page 7: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/7.jpg)
Corso di Informatica 2009-2010 Lezione 11 7
Passing by valueE' estremamente importante ricordare che una funzione nonpuò mai modificare i parametri attuali che le sono passati,in quanto essa riceve una copia degli stessi. Quando sipassa una variabile ad una funzione, viene passato il suovalore, cioè una copia della variabile stessa.
La funzione chiamata, perciò, non accede all'area di memoriaassociata alla variabile, ma a quella associata alla copia: essapuò dunque modificare a piacere i parametri ricevuti senza ilrischio di causare modifiche delle variabili della funzionechiamante. Le copie dei parametri attuali sono, inoltre, localialla funzione, ovvero sono create e distrutte al termine dellafunzione.
![Page 8: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/8.jpg)
Corso di Informatica 2009-2010 Lezione 11 8
Passing by referenceUna funzione puo’ tuttavia modificare il valore di unavariabile reale se ne conosce l’indirizzo, ovvero il puntatore !
Se un puntatore è parametro formale di una funzione, ilparametro attuale corrispondente rappresenta l'indirizzodi un'area di memoria: coerentemente, alla funzionechiamata è passata una copia del puntatore, ma tramitel'indirizzo contenuto nel puntatore la funzione puòaccedere all'area di memoria "originale", (solo ilpuntatore viene duplicato).
Questo meccanismo per il passaggio di parametri e’ dettopassaggio per riferimento (passing by reference).
![Page 9: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/9.jpg)
Corso di Informatica 2009-2010 Lezione 11 9
Passing by reference: esempio#include <stdio.h>void Modify(int *pa){ *pa += 10; printf(“\n Valore del Parametro Formale: %d“, *pa);}
main(){ int a = 5;
Modify(&a); printf(“\n Valore del Parametro attuale: %d“, a);}
Notate la diversa definizione della funzione ed il passaggio comeargomento dell’indirizzo di a utilizzando l’operatore &.
![Page 10: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/10.jpg)
Corso di Informatica 2009-2010 Lezione 11 10
Swapping: scambio#include <stdio.h>void swap(int *pa, int *pb){ int temp;
temp = *pa; *pa = *pb; *pb = temp;}
main(){ int a = 5, b = 8; printf(“\n Prima: a = %d b = %d”, a, b);
swap(&a, &b); printf(“\n Dopo: a = %d b = %d”, a, b);}
![Page 11: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/11.jpg)
Corso di Informatica 2009-2010 Lezione 11 11
Arrays e funzioniL’unico modo per passare un intero array come argomento di una funzione e di ricorrere ai puntatori
Se si introduce un puntatore all’array e si passa questo puntatorealla funzione, allora la funzione conoscerà l’indirizzo dell’array e potrà accedere a tutti gli elementi dello stesso
Come fa la funzione a conoscere il numero di elementi dell’array ?
2 possibili soluzioni
![Page 12: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/12.jpg)
Corso di Informatica 2009-2010 Lezione 11 12
Arrays e funzioniE’ possibile passare come argomento alla funzione il numero di elementi dell’array.
Alla funzione sono qiuindi passati due argomenti: un puntatoreal primo elemento dell’array e una variabile di tipo int che specifica il numero di elementi dell’array
![Page 13: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/13.jpg)
Corso di Informatica 2009-2010 Lezione 11 13
![Page 14: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/14.jpg)
Corso di Informatica 2009-2010 Lezione 11 14
Arrays e funzioniE’ possibile identificare l’ultimo elemento di un array immagazzinando al suo interno un valore particolare.
Quando la funzione processa l’array cerca quel valore particolare in ogni elemento, quando il valore è trovato allora vuol dire l’array è terminato
![Page 15: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/15.jpg)
Corso di Informatica 2009-2010 Lezione 11 15
![Page 16: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/16.jpg)
Corso di Informatica 2009-2010 Lezione 11 16
Passare un puntatore e’passare un . . . .array
#include <stdio.h>void ProdScalare(int Dim, double *a, double *b, double *Val){ int i; *Val = 0.; for(i = 0; i < Dim; i++) *Val = *Val + a[i] * b[i];}
main(){ double pippo[] = {3.5, 5.4, 8.4}; double pluto[] = {6.4, 1.2, 4.5}, Val;
ProdScalare(3, pippo, pluto, &Val); printf(“\n Il Valore del Prodotto Scalare e’: %lf“, Val);}
![Page 17: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/17.jpg)
Corso di Informatica 2009-2010 Lezione 11 17
ed ancora . . . .#include <stdio.h>void ProdScalare(int Dim, double a[], double b[], double*Val){ *Val = 0.; for(i = 0; i < Dim; i++) *Val = *Val + a[i] * b[i];}
#include <stdio.h>
void ProdScalare(int Dim, const double *a, const double *b, double *Val){
*Val = 0.;
for(i = 0; i < Dim; i++) *Val = *Val + a[i] * b[i];
}
![Page 18: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/18.jpg)
Caratteri e stringheCaratteri e stringhe
![Page 19: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/19.jpg)
Corso di Informatica 2009-2010 Lezione 11 19
Caratteri e stringheUn carattere è una singola lettera, numero, segno di punteggiatura, o altro simbolo equivalente
Una stringa è una qualsiasi sequenza di caratteri
In C i caratteri sono variabili di tipo char
In realtà char rappresenta un tipo di variabile numerica intera, il che è comprensibile dal momento che il calcolatore rappresentai caratteri con i corrispondenti codici ASCII
![Page 20: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/20.jpg)
Corso di Informatica 2009-2010 Lezione 11 20
CaratteriCome ogni altra variabile i caratteri vanno dichiarati primadel loro utilizzo
E’ possibile altresì definire delle variabili di tipo char come costanti
![Page 21: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/21.jpg)
Corso di Informatica 2009-2010 Lezione 11 21
![Page 22: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/22.jpg)
Corso di Informatica 2009-2010 Lezione 11 22
WarningUna variabile di tipo char può assumere un valore massimo pari a 127, mentre i codici ASCII arrivano sino a 255.
In realtà i codici ASCII sono divisi in due parti• codici standard sino a 127 (lettere, numeri, segni di punteggiatura)• codici ASCII “estesi” da 128 a 255 (caratteri speciali)
In conclusione per stampare caratteri standard è possibile utilizzarevariabili di tipo char, mentre per utilizzare i caratteri “estesi” si devono utilizzare variabili di tipo unsigned char
![Page 23: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/23.jpg)
Corso di Informatica 2009-2010 Lezione 11 23
![Page 24: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/24.jpg)
Corso di Informatica 2009-2010 Lezione 11 24
StringheLe stringhe sono sequenze di caratteri e sono rappresentabilimediante array unidimensionali di tipo char
Per convenzione ogni stringa in C deve terminare con il caratterenullo \0 ne consegue che in un array con 10 elementi è possibileimmagazzinare al più 9 caratteri
E’ possibile inizializzare una array di caratteri elemento per elemento
![Page 25: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/25.jpg)
Corso di Informatica 2009-2010 Lezione 11 25
StringheIn maniera più conveniente è possibile scrivere
In questo caso il compilatore aggiunge automaticamente il carattere nullo di fine stringa
Visto il legame esistente tra array e puntatori è chiaro chele seguenti due espressioni sono equivalenti
![Page 26: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/26.jpg)
Corso di Informatica 2009-2010 Lezione 11 26
La funzione malloc()La funzione malloc() è una delle funzioni del C per l’allocazione della memoria
La funzione malloc() richiede per argomento il numero di bytes di memoria richiesti e ritorna l’indirizzo del primo byte del bloccodi memoria allocato
malloc() ritorna un puntatore al blocco di memoria allocato, ma se non riesce ad effettuare la allocazione allora ritorna NULL
![Page 27: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/27.jpg)
Corso di Informatica 2009-2010 Lezione 11 27
![Page 28: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/28.jpg)
Corso di Informatica 2009-2010 Lezione 11 28
Stringhe e allocazionedinamica
E’ possibile utilizzare malloc() per allocare la memoria necessariaa contenere una stringa
![Page 29: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/29.jpg)
Corso di Informatica 2009-2010 Lezione 11 29
![Page 30: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/30.jpg)
Corso di Informatica 2009-2010 Lezione 11 30
DON’T
Non allocare una quantità di memoria superiore alle reali necessità
Non assegnare una nuova stringa ad un array di caratteri precedentemente allocato per contenere solo una stringa piùpiccola
![Page 31: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/31.jpg)
Corso di Informatica 2009-2010 Lezione 11 31
Visualizzare stringhePer visualizzare sullo schermo una stringa è possibileutilizzare le funzioni puts() e printf()
Per visualizzare una stringa con la funzione puts() è sufficiente fornire come argomento a puts() un puntatore alla stringa
![Page 32: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/32.jpg)
Corso di Informatica 2009-2010 Lezione 11 32
Visualizzare stringhePer visualizzare una stringa con la funzione printf()bisogna utilizzare la specifica di conversione %s e passarecome argomento un puntatore alla stringa
![Page 33: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/33.jpg)
Corso di Informatica 2009-2010 Lezione 11 33
Input di stringheL’input di stringhe può essere effettuato mediante le funzioni gets() e scanf()
La funzione gets() legge tutti i caratteri digitati sulla tastiera sinoal carattere di newline (Enter) e immagazzina la stringa in un’areadi memoria cui punta un puntatore di tipo char passato come argomento
![Page 34: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/34.jpg)
Corso di Informatica 2009-2010 Lezione 11 34
![Page 35: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/35.jpg)
Corso di Informatica 2009-2010 Lezione 11 35
Input di stringheE’ possibile utilizzare la funzione scanf() con la specifica di conversione %s
L’inizio della stringa in input è dato dal primo carattere non-bianco, mentre il termine è segnalato da un carattere bianco (spazio, tab, o a capo)
![Page 36: Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di Informatica 2009-2010 Lezione 11 8 Passing by reference Una funzione puo’ tuttavia](https://reader036.fdocument.pub/reader036/viewer/2022062403/5fd8f584188d6d6292623e29/html5/thumbnails/36.jpg)
Corso di Informatica 2009-2010 Lezione 11 36