corso di informatica a.a. 2009- 2010people.na.infn.it/~itaco/informatica/lezione11.pdf · corso di...
TRANSCRIPT
Corso di Informatica 2009-2010 Lezione 11 1
Corso di Informatica A.A. 2009- 2010Corso di Informatica A.A. 2009- 2010
Lezione 11
Utilizzo dei puntatoriUtilizzo dei puntatori
• Funzioni
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..);
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”
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).
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.
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.
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).
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 &.
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);}
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
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
Corso di Informatica 2009-2010 Lezione 11 13
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
Corso di Informatica 2009-2010 Lezione 11 15
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);}
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];
}
Caratteri e stringheCaratteri e stringhe
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
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
Corso di Informatica 2009-2010 Lezione 11 21
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
Corso di Informatica 2009-2010 Lezione 11 23
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
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
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
Corso di Informatica 2009-2010 Lezione 11 27
Corso di Informatica 2009-2010 Lezione 11 28
Stringhe e allocazionedinamica
E’ possibile utilizzare malloc() per allocare la memoria necessariaa contenere una stringa
Corso di Informatica 2009-2010 Lezione 11 29
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
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
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
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
Corso di Informatica 2009-2010 Lezione 11 34
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)
Corso di Informatica 2009-2010 Lezione 11 36