Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di...

Post on 25-Aug-2020

19 views 1 download

Transcript of Corso di Informatica A.A. 2009- 2010people.na.infn.it/~itaco/informatica/Lezione11.pdf · Corso di...

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