corso di informatica a.a. 2009- 2010people.na.infn.it/~itaco/informatica/lezione11.pdf · corso di...

36
Corso di Informatica 2009-2010 Lezione 11 1 Corso di Informatica A.A. 2009- 2010 Corso di Informatica A.A. 2009- 2010 Lezione 11

Upload: others

Post on 25-Aug-2020

18 views

Category:

Documents


1 download

TRANSCRIPT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Corso di Informatica 2009-2010 Lezione 11 36