Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il...

249
Programmazione in C

Transcript of Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il...

Page 1: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Programmazione in C

Page 2: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

2

I puntatori e l’allocazione dinamica di memoria

Il tipo di dato puntatoreVariabili e operatori sui puntatoriDualità puntatore-vettorePuntatori e struttureAllocazione dinamica di memoriaStrutture dati dinamicheEsercizi propostiSommario

Page 3: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

I puntatori e l’allocazione dinamica di memoria

Page 4: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

4

Il tipo di dato puntatore

Identificare una variabile in CI puntatori come riferimento a datiDefinizione e operatori su puntatori

Page 5: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Il tipo di dato puntatore

Page 6: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

6

Come si identifica una variabile?

i media

cognome

s

Un nome (identificatore)

Page 7: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

7

Come si identifica una variabile?

4

i media

cognome[i]

s

Nome+indice (array)

Page 8: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

8

Come si identifica una variabile?

i media

cognome[i]

s.cognome

Sequenza di nomi

Page 9: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

9

Come si identifica una variabile?

4

i media

cognome

s.cognome[i]

Sequenza di nomi+indice

Page 10: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

10

Le variabili sono in memoria

Ogni variabile della RAM, è caratterizzata da

Indirizzo (es. 3A7F0304)Codifica (es. intero, reale, carattere)

RAM(1 GB)

Page 11: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

11

Informazione = indirizzo + codifica

Per accedere a un dato (un’informazione) ènecessario (e sufficiente) conoscere:

Dove si trova in memoria (indirizzo)Come è codificato (tipo di dato)

L’accesso a variabili mediante identificatore(nome) è garantito da una tabella (non visibile a programmatore e utente) che associa ad ogni identificatore indirizzo e tipo di datoSono possibili strumenti alternativi di accesso ai dati, purché consentano di raggiungere indirizzo e tipo di dato

Page 12: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Il tipo di dato puntatore

Page 13: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

13

Puntatore = indirizzo + tipo

RAM(1 GB)

Un puntatore (→) denota:• Posizione in memoria• Tipo (codifica) di un

dato in memoria•

Page 14: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

14

Accesso mediante puntatore

RAM(1 GB)

Page 15: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

15

Accesso mediante puntatore

RAM(1 GB)

Puntatore dato intero all’indirizzo 3A7F0304

Page 16: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

16

Accesso mediante puntatore

RAM(1 GB)

Puntatore dato reale all’indirizzo 3A7F2016

Page 17: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

17

Accesso mediante puntatore

RAM(1 GB)

Puntatore carattere all’indirizzo 3A7F2020

Page 18: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

18

Accesso mediante puntatore

RAM(1 GB)

Puntatore a structstudente all’indirizzo 3A7F2020

Page 19: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

19

Puntatore: strumento di accesso e dato

Il puntatore è strumento alternativo (a un identificatore) per accedere a un datoIl puntatore è un’informazione manipolabile (si può calcolare, modificare, assegnare), a differenza di un identificatore (che non può essere modificato)

Page 20: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

20

Puntatore: strumento di accesso e dato

Il puntatore è strumento alternativo (a un identificatore) per accedere a un datoIl puntatore è un’informazione manipolabile(si può calcolare, modificare, assegnare), a differenza di un identificatore (che non può essere modificato)

Novità: il puntatore è (anche) un dato!

Page 21: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

21

Dato che punta a dato

Page 22: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

22

Operazioni su puntatori

S

Page 23: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

23

Operazioni su puntatori

S

Dato S (variabile con nome)

Page 24: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

24

Operazioni su puntatori

S

Dato S (variabile con nome)

Puntatore a S

Page 25: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

25

&S

Operazioni su puntatori

S

Dato S (variabile con nome)

Puntatore a S

Page 26: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

26

Operazioni su puntatori

P

Page 27: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

27

Operazioni su puntatori

P

Variabile Puntatore

Page 28: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

28

Operazioni su puntatori

P

Variabile PuntatoreOggetto (senza nome)

puntato da P

Page 29: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

29

Operazioni su puntatori

P

Variabile PuntatoreOggetto (senza nome)

puntato da P*P

Page 30: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Il tipo di dato puntatore

Page 31: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

31

Operatori sui puntatori

I simboli * e & sono utilizzati, in definizioni e uso dei puntatori, per indicare (in forma prefissa)

*… : dato puntato da …&… : puntatore a …

Page 32: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

32

Definire una variabile puntatore

La definizione di una variabile puntatore richiede il riferimento a un tipo base (quello del dato puntato)

int *px;char *p0, *p1;struct studente *pstud;FILE *fp;

Page 33: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

33

Definire una variabile puntatore

La definizione di una variabile puntatore richiede il riferimento a un tipo base (quello del dato puntato)

int *px;char *p0, *p1;struct studente *pstud;FILE *fp;

Variabile px di tipo “puntatore a intero”

Page 34: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

34

Definire una variabile puntatore

La definizione di una variabile puntatore richiede il riferimento a un tipo base (quello del dato puntato)

int *px;char *p0, *p1;struct studente *pstud;FILE *fp;

Variabili p0 e p1 di tipo “puntatore a carattere”

Page 35: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

35

Definire una variabile puntatore

La definizione di una variabile puntatore richiede il riferimento a un tipo base (quello del dato puntato)

int *px;char *p0, *p1;struct studente *pstud;FILE *fp;

Variabile pstud di tipo “puntatore a struct studente”

Page 36: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

36

Definire una variabile puntatore

La definizione di una variabile puntatore richiede il riferimento a un tipo base (quello del dato puntato)

int *px;char *p0, *p1;struct studente *pstud;FILE *fp;

Variabile fp di tipo “puntatore a FILE”

Page 37: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

37

Definire un puntatore: sintassi (1/2)

La definizione

può essere letta in due modi:a) *px (dato puntato da px) sarà (!) di tipo intero.

NOTA: la variabile px, al momento della definizione, NON contiene ancora un dato (un puntatore). NON esiste ancora un dato puntato, ma ci sarà dopo la prima assegnazione!

b) int * (tipo puntatore a intero) è il tipo della variabile px

int *px;

Page 38: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

38

Definire un puntatore: sintassi (2/2)

La definizione di un puntatore può esser fatta in due modi (con diverso uso degli spazi):a) <tipo base> *<identificatore>;

l’asterisco viene posto accanto all’identificatore

b) <tipo base> * <identificatore>; spazi tra asterisco e identificatore

int *px;

int * px; int* px;oppure

Page 39: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

39

Definizione fattorizzata di più puntatori

La definizione di più variabili puntatore (stesso tipo base) nella stessa istruzione segue la strategia (a):

<tipo base> *<id_1>, *<id_2>…, *<id_n>;

Si scrive una sola volta il tipo base, mentre si premette un asterisco per ogni variabile dichiarata. Es.

int *px,*py;char *s0, *s1, *s2;

Page 40: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

I puntatori e l’allocazione dinamica di memoria

Page 41: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

2

Variabili e operatori sui puntatori

Gli operatori & e *Puntatori e operazione di assegnazioneAritmetica dei puntatoriParametri per riferimento a funzioni

Page 42: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Variabili e operatori sui puntatori

Page 43: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

4

L’operatore & (puntatore a…)

L’operatore & calcola (ritorna) un puntatore al dato (spesso una variabile) a cui viene applicato

Esempio:

S

&S

&s /* Puntatore alla variabile s */

Page 44: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

5

L’operatore * (dato puntato da…)

L’operatore * (indirezione o deferimento) calcola (ritorna) il dato puntato da un puntatore

Esempio:

P

*P

*p /* Dato puntato da p */

Page 45: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Variabili e operatori sui puntatori

Page 46: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

7

Assegnazione a variabile puntatore

Si assegna a una variabile puntatore il risultato di un’espressione che calcola un puntatore (del tipo corretto)

Esempi:

p = &x;s = p; pnome = &(stud.nome); p_i = &dati[i];

Page 47: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

8

Assegnazione a variabile puntatore

Si assegna a una variabile puntatore il risultato di un’espressione che calcola un puntatore (del tipo corretto)

Esempi:

p = &x;s = p; pnome = &(stud.nome); p_i = &dati[i];

Puntatore a variabile x

Page 48: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

9

Assegnazione a variabile puntatore

Si assegna a una variabile puntatore il risultato di un’espressione che calcola un puntatore (del tipo corretto)

Esempi:

p = &x;s = p;pnome = &(stud.nome); p_i = &dati[i];

Assegnazione tra puntatori

Page 49: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

10

Assegnazione a variabile puntatore

Si assegna a una variabile puntatore il risultato di un’espressione che calcola un puntatore (del tipo corretto)

Esempi:

p = &x;s = p; pnome = &(stud.nome);p_i = &dati[i];

Puntatore a campo di struct

Page 50: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

11

Assegnazione a variabile puntatore

Si assegna a una variabile puntatore il risultato di un’espressione che calcola un puntatore (del tipo corretto)

Esempi:

p = &x;s = p; pnome = &(stud.nome); p_i = &dati[i];

Puntatore a casella di vettore

Page 51: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

12

Assegnazione a dato puntato

Si assegna al dato (variabile) puntato (da un puntatore) un valore compatibile con il tipo di dato

Esempi:

*p = 3*(x+2);*s = *p;*p_i = *p_i+1;

Page 52: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

13

Assegnazione a dato puntato

Si assegna al dato (variabile) puntato (da un puntatore) un valore compatibile con il tipo di dato

Esempi:

*p = 3*(x+2);*s = *p;*p_i = *p_i+1;

Assegna espressione intera a dato puntato da p

Page 53: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

14

Assegnazione a dato puntato

Si assegna al dato (variabile) puntato (da un puntatore) un valore compatibile con il tipo di dato

Esempi:

*p = 3*(x+2);*s = *p;*p_i = *p_i+1;

Copia variabile puntata da p in variabile puntata da s

Page 54: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

15

Assegnazione a dato puntato

Si assegna al dato (variabile) puntato (da un puntatore) un valore compatibile con il tipo di dato

Esempi:

*p = 3*(x+2);*s = *p;*p_i = *p_i+1;

Incrementa variabile puntata da p_i

Page 55: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

16

Il tipo void *

Un puntatore generico può essere definito in C facendo riferimento al tipo void *Un puntatore generico (void *) puo essere convertito (e assegnato) in modo legale da/a un puntatore di altro tipo (es. int *)

int *px;char *s0;void *generic;...generic = px;...s0 = generic;

Page 56: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

17

La costante NULL

Il valore effettivamente assegnato ad una variabile puntatore è un indirizzo in memoriaEsiste una costante utilizzabile come “puntatore nullo” (lo “zero” dei tipi puntatori). Tale costante corrisponde al valore intero 0La costante simbolica NULL (definita in <stdio.h>) può essere utilizzata per rappresentare tale costante

Page 57: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

18

int x;int *p = &x;char *s = NULL;

Inizializzazione di variabile puntatore

Si può assegnare un valore a una variabile puntatore contestualmente alla dichiarazione

Esempi:

Page 58: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

19

Inizializzazione di variabile puntatore

Si può assegnare un valore a una variabile puntatore contestualmente alla dichiarazione

Esempi:

oppure (dichiarazioni equivalenti):

int x;int *p = &x;char *s = NULL;

int x, *p = &x;char *s = NULL;

Page 59: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

20

Confronto tra puntatori

Un confronto tra due puntatori ritorna valore vero se i due puntatori fanno riferimento allo stesso dato (stesso indirizzo in memoria)

p1==p2

Un confronto tra dati puntati ritorna valore vero se (pur con puntatori a dati in locazioni diverse di memoria) i contenuti delle variabili puntate sono uguali

*p1==*p2

Page 60: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

21

Confronto tra puntatori

Un confronto tra due puntatori ritorna valore vero se i due puntatori fanno riferimento allo stesso dato (stesso indirizzo in memoria)

p1==p2

Un confronto tra dati puntati ritorna valore vero se (pur con puntatori a dati in locazioni diverse di memoria) i contenuti delle variabili puntate sono uguali

*p1==*p2

p1 p2

Page 61: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

22

Confronto tra puntatori

Un confronto tra due puntatori ritorna valore vero se i due puntatori fanno riferimento allo stesso dato (stesso indirizzo in memoria)

p1==p2

Un confronto tra dati puntati ritorna valore vero se (pur con puntatori a dati in locazioni diverse di memoria) i contenuti delle variabili puntate sono uguali

*p1==*p2

p1p2

3535

Page 62: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Variabili e operatori sui puntatori

Page 63: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

24

Incremento/decremento di puntatori

Incrementare (decrementare) di 1 un puntatore equivale a calcolare il puntatore al dato successivo (precedente) in memoria (supposto contiguo) dello stesso tipo

Esempio:

int x[100], *p = &x[50], *q, *r;...q = p+1; /* equivale a q=&x[51] */r = p-1; /* equivale a r=&x[49] */q++; /* ora q punta a x[52] */

Page 64: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

25

Somma e differenza applicate a puntatori

Sommare (sottrarre) un valore intero i a un puntatore corrisponde a incrementare (decrementare) i volte di 1 il puntatore

Esempio:

int x[100], *p = &x[50], *q, *r;...q = p+10; /* equivale a q=&x[60] */r = p-10; /* equivale a r=&x[40] */r -= 5; /* ora r punta a x[35] */

Page 65: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

26

Esempio: implementazioni di strlen (1/3)

/* implementazione senza puntatori *//* uso di un contatore/indice */int strlen (char string[]){

int l=0;while (string[l] != ‘\0’)l++;

return (l);}

Page 66: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

27

Esempio: implementazioni di strlen (2/3)

/* implementazione con puntatore *//* uso di un contatore */int strlen (char string[]){

char *p=&string[0];int l=0;while (*p != ‘\0’) {p++; l++;

}return (l);

}

Page 67: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

28

Esempio: implementazioni di strlen (3/3)

/* implementazione con 2 puntatori *//* conteggio mediante differenza tra

puntatori */int strlen (char string[]){

char *p0=&string[0], *p1=p0;while (*p1 != ‘\0’)

p1++;return (p1-p0);

}

Page 68: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Variabili e operatori sui puntatori

Page 69: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

30

Parametri a Funzioni

Il linguaggio C prevede unicamente passaggio di parametri a funzioni per valore (“by value”)

Il valore del parametro attuale, calcolato alla chiamata della funzione, viene copiato nel parametro formale

Non è previsto passaggio per riferimento (“byreference”), ma lo si realizza, in pratica, mediante

Passaggio per valore di puntatore a dato

Page 70: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

31

Esempio: swapInt

/* scambio valori tra variabili */int swapInt (int *a, int *b) {

int tmp=*a;*a=*b; *b=tmp;

}...void main (void) {

int x, y;...swapInt(&x,&y);...

}

Page 71: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

I puntatori e l’allocazione dinamica di memoria

Page 72: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

2

Dualità puntatore-vettore

Vettore = puntatoreVettore come parametro a funzionePuntatori e stringheVettori di puntatori

Page 73: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Dualità puntatore-vettore

Page 74: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

4

Vettore = puntatore

Data una variabile di tipo vettoreEs. int dati[100];

Il nome della variabile corrisponde al puntatoreal primo elemento del vettore stesso

dati equivale a &<dati>[0]*dati equivale a <dati>[0]

Page 75: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

5

Puntatore al primo dato

-186312-93214735 dati[0]

...

dati[7]

...

...

dati

Page 76: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

6

Puntatore al primo dato

-186312-93214735 dati[0]

...

dati[7]

dati&dati[0]

...

...

Page 77: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

7

Puntatore al primo dato

-186312-93214735 dati[0]

...

dati[7]

dati&dati[0]

...

=

...

Page 78: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

8

I-esimo dato

-186312-93214735 *dati

...

*(dati+7)

datidati

...dati+7

...

Page 79: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

9

Esempio 1

dati

...

dati[0]

...

dati[7]

...

v

int dati[100], *v;...

Page 80: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

10

Esempio 1

dati

...

dati[0]

...

dati[7]

...

v

int dati[100], *v;...v = &dati[0];

Page 81: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

11

Esempio 1

-186312-93214735

dati

...

dati[0]

...

dati[7]

...

v

int dati[100], *v;...v = &dati[0];for (i=0;i<100;i++)scanf(“%d”,&v[i]);

Page 82: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

12

Esempio 1

-186312-93214735

dati

...

dati[0]

...

dati[7]

...

v

int dati[100], *v;...v = dati;for (i=0;i<100;i++)scanf(“%d”,v+i);

Page 83: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

13

Esempio 1

-186312-93214735

dati

...

dati[0]

...

dati[7]

...

v

int dati[100], *v;...v = dati;for (i=0;i<100;i++)scanf(“%d”,v+i);

dati = &dati[0]

Page 84: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

14

Esempio 1

-186312-93214735

dati

...

dati[0]

...

dati[7]

...

v

int dati[100], *v;...v = dati;for (i=0;i<100;i++)scanf(“%d”,v+i);

dati = &dati[0]

v+i = &v[i]

Page 85: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

15

Esempio 2

dati

...

dati[0]

...

dati[7]

...

v

int dati[100], *v, i;...

Page 86: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

16

Esempio 2

-186312-932

dati

...

dati[0]

...

dati[7]

...

v

int dati[100], *v, i;...v = &dati[3];for (i=0;i<97;i++)scanf(“%d”,&v[i]);

for (i=0;i<97;i++)printf(“%d”,v[i]);

Page 87: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

17

Esempio 2 (variante)

-186312-932

dati

...

dati[0]

...

dati[7]

...

v

int dati[100], *v, i;...v = dati+3;for (i=0;i<97;i++)scanf(“%d”,v++);

v = dati+3;for (i=0;i<97;i++)printf(“%d”,*v++);

Page 88: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Dualità puntatore-vettore

Page 89: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

19

Parametro formale vettore

Ad un parametro formale vettore può corrispondere un parametro attuale puntatore

Consente di generare un vettore (per una funzione) da un sotto-vettore, oppure da un puntatore (a memoria contigua)

Page 90: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

20

Parametro formale vettore

Ad un parametro formale vettore può corrispondere un parametro attuale puntatore

Consente di generare un vettore (per una funzione) da un sotto-vettore, oppure da un puntatore (a memoria contigua)

void ordinaInt(int v[], int n);...int dati[100];...for (i=0;i<100;i+=10)ordinaInt(&dati[i],10);

Page 91: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

21

Parametro formale vettore

Ad un parametro formale vettore può corrispondere un parametro attuale puntatore

Consente di generare un vettore (per una funzione) da un sotto-vettore, oppure da un puntatore (a memoria contigua)

void ordinaInt(int v[], int n);...int dati[100];...for (i=0;i<100;i+=10)ordinaInt(&dati[i],10);

In un parametro formale vettore (monodimensionale) è possibile omettere la dimensione del vettore

Page 92: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

22

Parametro formale vettore

Ad un parametro formale vettore può corrispondere un parametro attuale puntatore

Consente di generare un vettore (per una funzione) da un sotto-vettore, oppure da un puntatore (a memoria contigua)

void ordinaInt(int v[], int n);...int dati[100];...for (i=0;i<100;i+=10)ordinaInt(&dati[i],10);

Ordinamento applicato a sotto-vettori di 10 elementi

Page 93: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

23

Parametro formale puntatore

Ad un parametro formale puntatore può corrispondere un parametro attuale vettore

Il puntatore, a sua volta, può essere trattato internamente come vettore (purché punti a dati contigui in memoria)

Page 94: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

24

Parametro formale puntatore

Ad un parametro formale puntatore può corrispondere un parametro attuale vettore

Il puntatore, a sua volta, può essere trattato internamente come vettore (purchè punti a dati contigui in memoria)

void leggiInt(int *p, int n);...int dati[100];...leggiInt(dati,100);

Page 95: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Dualità puntatore-vettore

Page 96: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

26

Stringa come vettore

Una stringa è (formalmente) un vettore di caratteri (terminato da ’\0’)

int strlenMia (char s[]){int cnt;for (cnt=0;s[cnt]!=’\0’;cnt++);return cnt;

}

Page 97: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

27

Stringa come puntatore

Una stringa (vettore) può essere rappresentata (e manipolata) mediante puntatori

int strlenMia (char *s){int cnt=0;while (*s++ != ’\0’)cnt++;

return cnt;}

Page 98: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

28

Stringa e aritmetica dei puntatori

La lunghezza di una stringa può essere calcolata mediante aritmetica dei puntatori

int strlenMia (char *s){char *p=s;while (*p != ’\0’)p++;

return p-s;}

Page 99: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

29

Esempio 1: confronto tra stringhe

Date due stringhe, confrontarne i contenuti, ritornando:

0 se le stringhe sono uguali<0 se la prima stringa precede la seconda >0 se la prima stringa segue la seconda

Se le stringhe differiscono si ritorna la differenza tra i codici dei primi caratteri diversi

Page 100: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

30

Confronto tra stringhe (vettori)

int strcmpMia (char s0[], char s1[]){int i=0;while (s0[i]==s1[i] && s0[i]!=’\0’)i++;

return (s1[i]-s0[i]);}

Strategia: Iterazione confrontare i caratteri sino alla prima differenza, oppure al terminatore di stringa Si ritorna la differenza tra i caratteri diversi (o i terminatori)

Page 101: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

31

Confronto tra stringhe (puntatori)

int strcmpMia (char *s0, char *s1){while ((*s0==*s1) && (*s0!=’\0’)){

s0++;s1++;

}return (*s1-*s0);

}

Stessa strategia ma iterazione con avanzamento dei puntatori

Page 102: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

32

Confronto tra stringhe con limite (vettori)

int strncmpMia (char *s0, char *s1, int n){int i=0;while (s0[i]==s1[i] && s0[i]!=’\0’)if (i<n) i++;else return 0;

return (s1[i]-s0[i]);}

Strategia: Come strcmpMia, ma il confronto si limita ai primi n caratteri

Page 103: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

33

Esempio 2: ricerca di sottostringa

Date due stringhe, cercare la prima occorrenza della seconda stringa all’interno della prima, ritornando un puntatore:

NULL se non viene trovata la seconda stringa all’interno della primaAl primo carattere della sottostringa trovata

Page 104: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

34

Ricerca di sottostringa

int strstrMia (char s[], char cerca[]){

int i,ns=strlen(s),nc=strlen(cerca);for (i=0; i<=ns-nc; i++)

if (strncmpMia(&s[i],cerca,nc)==0)return (&s[i]);

return (NULL);}

Strategia: Iterazione che, per l’i-esimo carattere della prima stringa, determina se si tratta dell’inizio della sotto-stringa cercata (usando strncmpMia)

Page 105: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Dualità puntatore-vettore

Page 106: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

36

Vettore di puntatori = matrice

Siccome un puntatore può corrispondere ad un vettoreAllora un vettore di puntatori può corrispondere a un vettore di vettori (una matrice)Esempio:

Dato un vettore di 7 puntatori a carattereInizializzarlo con puntatori alle stringhe che rappresentano i giorni della settimanaStampare l’i-esimo carattere di tutti i nomi di giorni (i letto da tastiera, con valori ammessi da 1 a 6)

Page 107: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

37

Esempio: vettore di stringhe

void main (void){int i,g;char *giorni[7]={”lunedì”,”martedì”,

”mercoledì”,”giovedì”,”venerdì”,”sabato”,”domenica”};

printf(”quale carattere (1-6)? ”);scanf(”%d”,&i);for (g=0; g<7; g++)printf(”%c”, giorni[g][i]);

}

Page 108: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

38

Esempio: vettore di stringhe

void main (void){int i,g;char *giorni[7]={”lunedì”,”martedì”,

”mercoledì”,”giovedì”,”venerdì”,”sabato”,”domenica”};

printf(”quale carattere (1-6)? ”);scanf(”%d”,&i);for (g=0; g<7; g++)printf(”%c”, giorni[g][i]);

}

Vettore di puntatori a char

Page 109: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

39

Esempio: vettore di stringhe

void main (void){int i,g;char *giorni[7]={”lunedì”,”martedì”,

”mercoledì”,”giovedì”,”venerdì”,”sabato”,”domenica”};

printf(”quale carattere (1-6)? ”);scanf(”%d”,&i);for (g=0; g<7; g++)printf(”%c”, giorni[g][i]);

}

Inizializzazione con puntatori a stringhe (costanti)

Page 110: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

40

Esempio: vettore di stringhe

void main (void){int i,g;char *giorni[7]={”lunedì”,”martedì”,

”mercoledì”,”giovedì”,”venerdì”,”sabato”,”domenica”};

printf(”quale carattere (1-6)? ”);scanf(”%d”,&i);for (g=0; g<7; g++)printf(”%c”, giorni[g][i]);

}

giorni[g]: stringa di ordine g

Page 111: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

41

Esempio: vettore di stringhe

void main (void){int i,g;char *giorni[7]={”lunedì”,”martedì”,

”mercoledì”,”giovedì”,”venerdì”,”sabato”,”domenica”};

printf(”quale carattere (1-6)? ”);scanf(”%d”,&i);for (g=0; g<7; g++)printf(”%c”, giorni[g][i]);

}

(giorni[g])[i]: i-esimo carattere della stringa di ordine g

Page 112: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

42

Esempio: vettore di stringhe

void main (void){int i,g;char *giorni[7]={”lunedì”,”martedì”,

”mercoledì”,”giovedì”,”venerdì”,”sabato”,”domenica”};

printf(”quale carattere (1-6)? ”);scanf(”%d”,&i);for (g=0; g<7; g++)printf(”%c”, giorni[g][i]);

}

giorni[g][i]: vettore di stringhe utilizzato come matrice di caratteri

Page 113: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

43

Vettore di stringhe

Un vettore di stringhe può essere realizzato comeMatrice di caratteri: vettore bidimensionale (righe, colonne). Le righe hanno tutte la stessa lunghezza (vanno sovradimensionate sulla stringa più lunga)Vettore di puntatori a stringhe: ogni elemento del vettore punta a una stringa distinta. Le stringhe possono avere lunghezze diverse

Con entrambi i metodi si può utilizzare la notazione matriciale

Page 114: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

44

Esempio: ordinamento di stringhe

Leggere da tastiera delle stringhe:Al massimo 20 stringheOgnuna al massimo di 50 caratteriLa somma delle lunghezze delle stringhe è <= 500L’input termina con una stringa vuota

Ordinare le stringhe in ordine crescente (secondo strcmp)Visualizzarle (secondo l’ordine precedente) su video

Page 115: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

45

Ordinamento di stringhe (con matrice)

void main (void){

int i,ns;char m[20][50];printf(”scrivi stringhe:\n”);for (ns=0; ns<20; ns++) {

gets(m[ns]);if (strlen(m[ns])==0) break;

}ordinaMatrice(m,ns);printf(”stringhe ordinate:\n”);for (i=0; i<ns; i++)

printf(”%s\n”, m[i]);}

Page 116: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

46

Ordinamento di stringhe (con matrice)

void main (void){

int i,ns;char m[20][50];printf(”scrivi stringhe:\n”);for (ns=0; ns<20; ns++) {

gets(m[ns]);if (strlen(m[ns])==0) break;

}ordinaMatrice(m,ns);printf(”stringhe ordinate:\n”);for (i=0; i<ns; i++)

printf(”%s\n”, m[i]);}

...

...

...

...

...

50 colonne20

rig

he

Page 117: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

47

Ordinamento di stringhe (con matrice)

void main (void){

int i,ns;char m[20][50];printf(”scrivi stringhe:\n”);for (ns=0; ns<20; ns++) {

gets(m[ns]);if (strlen(m[ns])==0) break;

}ordinaMatrice(m,ns);printf(”stringhe ordinate:\n”);for (i=0; i<ns; i++)

printf(”%s\n”, m[i]);}

m[ns] = &(m[ns][0])

...

...

...

...

...

Page 118: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

48

Ordinamento di stringhe (con matrice)

void main (void){

int i,ns;char m[20][50];printf(”scrivi stringhe:\n”);for (ns=0; ns<20; ns++) {

gets(m[ns]);if (strlen(m[ns])==0) break;

}ordinaMatrice(m,ns);printf(”stringhe ordinate:\n”);for (i=0; i<ns; i++)

printf(”%s\n”, m[i]);}

Page 119: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

49

Ordinamento di stringhe (con vettore)

void main (void) {int i,ns;char *v[20], buf[520];printf(”scrivi stringhe:\n”);for (ns=i=0; ns<20; ns++) {

v[ns]=buf+i; gets(v[ns]);if (strlen(v[ns])==0) break;i = i+strlen(v[ns])+1;

}ordinaVettore(v,ns);printf(”stringhe ordinate:\n”);for (i=0; i<ns; i++)

printf(”%s\n”, v[i]);}

Page 120: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

50

Ordinamento di stringhe (con vettore)

void main (void) {int i,ns;char *v[20], buf[520];printf(”scrivi stringhe:\n”);for (ns=i=0; ns<20; ns++) {

v[ns]=buf+i; gets(v[ns]);if (strlen(v[ns])==0) break;i = i+strlen(v[ns])+1;

}ordinaVettore(v,ns);printf(”stringhe ordinate:\n”);for (i=0; i<ns; i++)

printf(”%s\n”, v[i]);}

buf(520 char)V(20 punt.)

...

Page 121: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

51

Ordinamento di stringhe (con vettore)

void main (void) {int i,ns;char *v[20], buf[520];printf(”scrivi stringhe:\n”);for (ns=i=0; ns<20; ns++) {

v[ns]=buf+i; gets(v[ns]);if (strlen(v[ns])==0) break;i = i+strlen(v[ns])+1;

}ordinaVettore(v,ns);printf(”stringhe ordinate:\n”);for (i=0; i<ns; i++)

printf(”%s\n”, v[i]);}

Page 122: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

52

Ordinamento di stringhe (con vettore)

void main (void) {int i,ns;char *v[20], buf[520];printf(”scrivi stringhe:\n”);for (ns=i=0; ns<20; ns++) {

v[ns]=buf+i; gets(v[ns]);if (strlen(v[ns])==0) break;i = i+strlen(v[ns])+1;

}ordinaVettore(v,ns);printf(”stringhe ordinate:\n”);for (i=0; i<ns; i++)

printf(”%s\n”, v[i]);}

buf+i = &buf[i]

Page 123: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

53

Ordinamento di stringhe (con vettore)

void main (void) {int i,ns;char *v[20], buf[520];printf(”scrivi stringhe:\n”);for (ns=i=0; ns<20; ns++) {

v[ns]=buf+i; gets(v[ns]);if (strlen(v[ns])==0) break;i = i+strlen(v[ns])+1;

}ordinaVettore(v,ns);printf(”stringhe ordinate:\n”);for (i=0; i<ns; i++)

printf(”%s\n”, v[i]);}

Avanza in buf saltando stringa corrente più terminatore (’\0’)

Page 124: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

54

Ordinamento di stringhe (con vettore)

void main (void) {int i,ns;char *v[20], buf[520];printf(”scrivi stringhe:\n”);for (ns=i=0; ns<20; ns++) {

v[ns]=buf+i; gets(v[ns]);if (strlen(v[ns])==0) break;i = i+strlen(v[ns])+1;

}ordinaVettore(v,ns);printf(”stringhe ordinate:\n”);for (i=0; i<ns; i++)

printf(”%s\n”, v[i]);}

Page 125: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

55

Confronto tra le soluzioni

Matrice di caratteri20 righe: massimo numero di stringhe50 colonne: massima lunghezza di stringa20*50 = 1000 caratteri: dimensione matrice

Vettore di puntatori a stringhe20 puntatori: dimensione vettore di puntatori520 caratteri: dimensione di caratteri contenente le stringhe (500 caratteri per le stringhe + 20 terminatori)

Page 126: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

56

Confronto tra le soluzioni

Matrice di caratteri20 righe: massimo numero di stringhe50 colonne: massima lunghezza di stringa20*50 = 1000 caratteri: dimensione matrice

Vettore di puntatori a stringhe20 puntatori: dimensione vettore di puntatori520 caratteri: dimensione di caratteri contenente le stringhe (500 caratteri per le stringhe + 20 terminatori

20 puntatori + 520 caratteri < 1000 caratteri !

Page 127: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

57

Ordinamento (con matrice)

void ordinaMatrice (char m[][50], int n){int i, j, min; char tmp[50];for (i=0; i<n-1; i++) {min = i;for (j=i+1; j<n; j++)if (strcmp(m[min],m[j])>0) min = j;

strcpy(tmp,m[i]);strcpy(m[i],m[min]);strcpy(m[min].tmp);

}}

Page 128: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

58

Ordinamento (con matrice)

void ordinaMatrice (char m[][50], int n){int i, j, min; char tmp[50];for (i=0; i<n-1; i++) {min = i;for (j=i+1; j<n; j++)if (strcmp(m[min],m[j])>0) min = j;

strcpy(tmp,m[i]);strcpy(m[i],m[min]);strcpy(m[min].tmp);

}}

Con la matrice di caratteri gli scambi di stringa sono realizzati mediante copia

Page 129: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

59

Ordinamento (con vettore)

void ordinaVettore (char *m[20], int n){int i, j, min; char *tmp;for (i=0; i<n-1; i++) {min = i;for (j=i+1; j<n; j++)if (strcmp(m[min],m[j])>0) min = j;

tmp = m[i];m[i] = m[min];m[min] = tmp;

}}

Page 130: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

60

Ordinamento (con vettore)

void ordinaVettore (char *m[20], int n){int i, j, min; char *tmp;for (i=0; i<n-1; i++) {min = i;for (j=i+1; j<n; j++)if (strcmp(m[min],m[j])>0) min = j;

tmp = m[i];m[i] = m[min];m[min] = tmp;

}}

Con il vettore di puntatori gli scambi di stringa sono realizzati mediante scambio di puntatori

Page 131: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

I puntatori e l’allocazione dinamica di memoria

Page 132: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

2

Puntatori e strutture

Puntatore a strutturaAccesso a struttura puntataStrutture ricorsive

Page 133: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Puntatori e strutture

Page 134: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

4

Puntatore a struttura (1/2)

Per accedere a una struttura (tipo struct), utilizzando puntatori, si utilizzano le stesse regoleviste per gli altri tipi Si noti che un puntatore può:

Puntare a una struttura interaPuntare a un campo di strutturaEssere un campo di una struttura

Page 135: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

5

Puntatore a struttura (2/2)

p

struct studente{

char cognome[MAX], nome[MAX];int matricola;float media;

};...struct studente *p;...p = ...;

Page 136: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

6

Puntatore a struttura (2/2)

p

struct studente{

char cognome[MAX], nome[MAX];int matricola;float media;

};...struct studente *p;...p = ...;

Variabile Puntatore

Page 137: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

7

Puntatore a struttura (2/2)

p

struct studente{

char cognome[MAX], nome[MAX];int matricola;float media;

};...struct studente *p;...p = ...; Struttura puntata da p

*p

Page 138: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

8

struct studente{

char cognome[MAX], nome[MAX];int matricola;float media;

};...struct studente *p;...p = ...;

Puntatore a struttura (2/2)

p Campo media della struttura puntata da p

*p.media

Page 139: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

9

Puntatore a campo di struttura

p

...struct studente *p;float *mp;...p = ...;mp = &(*p).media;

mp

Page 140: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

10

Puntatore a campo di struttura

p

...struct studente *p;float *mp;...p = ...;mp = &(*p).media;

mp

Puntatore a campo media della struttura puntata da p

&(*p).media

Page 141: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

11

Puntatore come campo di struttura

struct esame {int scritto, orale;

};struct studente {

char cognome[MAX], nome[MAX];int matricola;struct esame *es;

};p

Page 142: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

12

Puntatore come campo di struttura

struct esame {int scritto, orale;

};struct studente {

char cognome[MAX], nome[MAX];int matricola;struct esame *es;

};p

Attenzione: NON è una struttura interna:

struct esame es;

Page 143: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

13

Puntatore come campo di struttura

p

...struct studente *p;...p = ...;(*p).es = ...;(*(*p).es).scritto = 26;(*(*p).es).orale = 30;

*p

(*p).es

*(*p).es

(*(*p).es).scritto

(*(*p).es).orale

Page 144: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Puntatori e strutture

Page 145: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

15

Accesso a struttura puntata

Il C dispone di una notazione alternativa(compatta) per rappresentare i campi di unastruttura puntata

Anzichè(*p).media

(*(*p).esame).scrittoSi può scrivere

p->mediap->esame->scritto

Page 146: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

16

Puntatore come campo di struttura

p

...struct studente *p;...p = ...;P->es = ...;P->es->scritto = 26;P->es->orale = 30;

*p

p->es

*(p->es)

p->es->scritto

p->es->orale

Page 147: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Puntatori e strutture

Page 148: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

18

Strutture ricorsive

Nell’ambito dei linguaggi di programmazione sidice ricorsiva (o recursiva) una entità che facciariferimento a se stessa (oppure ad una copia di se stessa, o entità dello stesso tipo)Una struttura (tipo struct) ricorsiva è unastruttura che include tra i suoi campi uno o piùpuntatori a strutture dello stesso tipo

Page 149: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

19

Definire una struttura ricorsiva

La definizione di una struttura ricorsiva contiene al suo interno almeno un puntatore che utilizzi come tipo base la struttura che si sta definendoEsempio:

struct studente {char cognome[MAX], nome[MAX];int matricola;struct studente *link;

};

Page 150: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

20

Definire una struttura ricorsiva

La definizione di una struttura ricorsiva contiene al suo interno almeno un puntatore che utilizzi come tipo base la struttura che si sta definendoEsempio:

struct studente {char cognome[MAX], nome[MAX];int matricola;struct studente *link;

};

Attenzione:struct studente

è in corso di definizione !

Page 151: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

21

Definire una struttura ricorsiva (alternativa)

E’ possibile uno schema di definizione alternativo, mediante typedef:

typedef struct studente *P_stud;struct studente {

char cognome[MAX], nome[MAX];int matricola;P_stud link;

};

Page 152: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

22

Esercizio: problema di Giuseppe Flavio

N oggetti sono disposti in cerchio. Per semplicitàgli oggetti sono numerati da 1 a N (N vale al massimo 100)Si elimina un oggetto ogni M (in senso antiorario) e si richiude il cerchioQuale oggetto rimane per ultimo? Con quale ordine si eliminano gli oggetti?

Page 153: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

23

Esempio: N=9, M=5

12

3

4

5

6 7

8

9

12

3

4

5

6 7

8

9

Page 154: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

24

Esempio: N=9, M=5

12

3

4

67

8

9

12

3

4

67

8

9

Page 155: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

25

Esempio: N=9, M=5

23

4

6

78

9

23

4

6

78

9

Page 156: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

26

Esempio: N=9, M=5

23

4

6 8

9

23

4

6 8

9

Page 157: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

27

Esempio: N=9, M=5

2

3

6 8

9

2

3

6 8

9

Page 158: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

28

Esempio: N=9, M=5

2

6 8

9 2

6 8

9

Page 159: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

29

Esempio: N=9, M=5

2 8

9

2 8

9

Page 160: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

30

Esempio: N=9, M=5

2 8 2 8

Page 161: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

31

Esempio: N=9, M=5

8

Ordine di eliminazione: 5, 1, 7, 4, 3, 6, 9, 2

Page 162: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

32

Strategia algoritmica (1/2)

Struttura datiCatena circolare (lista): ogni oggetto (numero) connesso a quello immediatamente al successivo. Numero i = i-esimo oggetto (iniziale)

InizioCreazione della catena di N oggetti per inserimento, partendo da 1, fino a N

Page 163: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

33

Strategia algoritmica (2/2)

Iterazione per selezionare/eliminare l’i-esimo oggetto

partendo dall’oggetto selezionatocontare M-1 oggetticonnettere l’oggetto M-1 con M+1, saltando M

Terminazione: 1 solo oggetto rimanente

Page 164: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

34

Struttura dati iniziale

12

3

4

5

6 7

8

9

987654321

Page 165: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

35

Giuseppe Flavio: soluzione (1/2)

#define NMAX 100struct oggetto { int numero; struct oggetto *succ;

};int main(void){int i, N, M;struct oggetto *p, oggetti[NMAX]; printf(“N = “); scanf(“%d”, &N);printf(“M = “); scanf(“%d”, &M);for (i=0; i<N; i++) {oggetti[i].numero = i+1;oggetti[i].succ = &oggetti[(i+1)%N];

}...

GiuseppeFlavio.c

Page 166: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

36

Giuseppe Flavio: soluzione (2/2)

...int main(void){int i, N, M;struct oggetto *p, oggetti[NMAX]; ...p = &oggetti[0];while (p != p->succ) {for (i=1; i<M; i++) p = p->succ;printf(“Eliminato n.%d\n“,

p->succ->numero);p->succ = p->succ->succ;

}printf(“Ultimo n.%d\n“, p->numero);

}

GiuseppeFlavio.c

Page 167: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

I puntatori e l’allocazione dinamica di memoria

Page 168: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

2

Allocazione dinamica di memoria

L’allocazione delle variabiliAllocazione e rilascio espliciti di memoriaLe funzioni malloc e free

Page 169: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Allocazione dinamica di memoria

Page 170: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

4

Allocare = collocare in memoria

Allocare una variabile significa associare allavariabile una porzione di memoria (in cui collocare i dati) L’allocazione avviene in modo

Permanente, per le variabili globali (definite, nelfile C, al di fuori da funzioniTemporaneo, per le variabili locali e I parametriformali (definiti all’interno delle funzioni). Unavariabile locale viene

Allocata alla chiamata della funzioneDe-allocata all’uscita dalla funzione

Page 171: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

5

Programma in esecuzione e memoria

RAM (1 GB)

#define MAX 100struct studente {...

};...struct studente dati[MAXN];int main(void){char nomefile[MAXRIGA];FILE *fp;...

}void ordinaStudenti(struct studente el[],int n)

{int i, j, max;...

};

Page 172: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

6RAM (1 GB)

Programma in memoria

#define MAX 100struct studente {...

};...struct studente dati[MAXN];int main(void){char nomefile[MAXRIGA];FILE *fp;...

}void ordinaStudenti(struct studente el[],int n)

{int i, j, max;...

};

Page 173: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

7RAM (1 GB)

Programma in memoria

#define MAX 100struct studente {...

};...struct studente dati[MAXN];int main(void){char nomefile[MAXRIGA];FILE *fp;...

}void ordinaStudenti(struct studente el[],int n)

{int i, j, max;...

};

Codice(istruzioni)

Page 174: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

8RAM (1 GB)

Programma in memoria

#define MAX 100struct studente {...

};...struct studente dati[MAXN];int main(void){char nomefile[MAXRIGA];FILE *fp;...

}void ordinaStudenti(struct studente el[],int n)

{int i, j, max;...

};

Codice(istruzioni)struct studente dati[MAXN];

Page 175: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

9RAM (1 GB)

Programma in memoria

#define MAX 100struct studente {...

};...struct studente dati[MAXN];int main(void){char nomefile[MAXRIGA];FILE *fp;...

}void ordinaStudenti(struct studente el[],int n)

{int i, j, max;...

};

Codice(istruzioni)struct studente dati[MAXN];

Variabili globali

Page 176: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

10RAM (1 GB)

Programma in memoria

#define MAX 100struct studente {...

};...struct studente dati[MAXN];int main(void){char nomefile[MAXRIGA];FILE *fp;...

}void ordinaStudenti(struct studente el[],int n)

{int i, j, max;...

};

Codice(istruzioni)

char nomefile[MAXRIGA];FILE *fp;

Variabili globali

struct studente el[],int n)

int i, j, max;

Page 177: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

11RAM (1 GB)

Programma in memoria

#define MAX 100struct studente {...

};...struct studente dati[MAXN];int main(void){char nomefile[MAXRIGA];FILE *fp;...

}void ordinaStudenti(struct studente el[],int n)

{int i, j, max;...

};

Codice(istruzioni)

char nomefile[MAXRIGA];FILE *fp;

Variabili globali

Variabili locali e parametri

(formali)

struct studente el[],int n)

int i, j, max;

Page 178: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

12RAM (1 GB)

Programma in memoria

#define MAX 100struct studente {...

};...struct studente dati[MAXN];int main(void){char nomefile[MAXRIGA];FILE *fp;...

}void ordinaStudenti(struct studente el[],int n)

{int i, j, max;...

};

Codice(istruzioni)

Variabili globali

Variabili locali e parametri

(formali)

In memoria (virtualmente) durante tutta l’esecuzione del programma

Page 179: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

13RAM (1 GB)

Programma in memoria

#define MAX 100struct studente {...

};...struct studente dati[MAXN];int main(void){char nomefile[MAXRIGA];FILE *fp;...

}void ordinaStudenti(struct studente el[],int n)

{int i, j, max;...

};

Codice(istruzioni)

Variabili globali

Variabili locali e parametri

(formali)In memoria (virtualmente) durante l’esecuzione della relativa funzione: allocate e de-allocate automaticamente

Page 180: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

14RAM (1 GB)

Programma in memoria

#define MAX 100struct studente {...

};...struct studente dati[MAXN];int main(void){char nomefile[MAXRIGA];FILE *fp;...

}void ordinaStudenti(struct studente el[],int n)

{int i, j, max;...

};

Codice(istruzioni)

Variabili globali

Variabili locali e parametri

(formali)

La quantità di memoria da allocare è determinata dal programmatore:- Istruzioni- Tipo e numero delle variabili- Dimensione dei vettori

Page 181: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Allocazione dinamica di memoria

Page 182: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

16

Cosa manca?

Osservazione: manca un modo per poterdecidere, durante l’esecuzione di un programma

Creazione un datoDimensionamento di un vettore

Soluzione: istruzioni per allocare e de-allocaredati (memoria) in modo esplicito

In funzione di dati forniti da chi esegue ilprogrammaAllocazioni e de-allocazioni sono (ovviamente) previste dall’autore del programma

Page 183: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

17

Come allocare in modo esplicito?

Il C fornisce un meccanismo di allocazione e de-allocazione esplicito, basato su puntatori

Allocare = chiedere memoria (al Sistema Operativo) e ottenerla (se c’è abbastanza memoria disponibile)De-allocare = rilasciare (restituire) la memoria precedentemente ottenuta (in modo che il S.O. possa riutilizzarla)

Alla memoria allocata si accede tramite puntatore, cioè indirizzo+tipoL’allocazione esplicita viene detta dinamica, per il modo (non statico) di gestione

Page 184: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

18RAM (1 GB)

Programma in memoria

int main(void){int *p = malloc(...);.../* p usato come vettore

*/free(p);

}

p Memoria dinamica

Codice(istruzioni)

Variabili globali

Variabili locali e parametri

(formali)

Page 185: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

19

Codice(istruzioni)

Variabili globali

Variabili locali e parametri

(formali)

RAM (1 GB)

Programma in memoria

int main(void){int *p = malloc(...);.../* p usato come vettore

*/free(p);

}

p

Allocazione

Page 186: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

20

Codice(istruzioni)

Variabili globali

Variabili locali e parametri

(formali)

RAM (1 GB)

Programma in memoria

int main(void){int *p = malloc(...);.../* p usato come vettore

*/free(p);

}

p

Rilascio (de-allocazione)

Page 187: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Allocazione dinamica di memoria

Page 188: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

22

Allocazione mediante malloc (1/3)

La memoria in C viene allocata dinamicamentetramite la funzione malloc (e altre, qualicalloc, realloc, …)La funzione di libreria malloc ha un prototiposimile al seguente

void* malloc (int dimensione);

Dimensione è il numero (intero) di byte daallocareIl valore di ritorno è un puntatore

Indirizzo iniziale della memoria allocata (NULL se non c’è memoria disponibile)tipo void *, tale da poter essere assegnato a qualunque tipo di puntatore

Page 189: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

23

Allocazione mediante malloc (2/3)

Per usarla occorre includere <stdlib.h>

Per utilizzare correttamente malloc occorre richiedere una quantità di memoria compatibile col puntatore cui sarà assegnato il risultato (cioèla variabile generata dinamicamente)

Page 190: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

24

Allocazione mediante malloc (3/3)

Solitamente si ricorre all’operatore sizeof per determinare la dimensione (in byte) di un dato. Per generare una variabile dinamica di tipo <tipo>, da assegnare a p (<tipo> *p), sono possibili 2 schemi

Per ottenere una variabile scalare o structp = malloc (sizeof (<tipo>));

Per ottenere un vettore di n elementi p = malloc (n*sizeof (<tipo>));

Page 191: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

25

Esempio: variabile dinamica singola

struct studente {char cognome[MAX], nome[MAX];int matricola; struct studente *link;

};struct studente *creaStud (

char *cognome, char *nome, int matricola) {

struct studente *s;s = malloc (sizeof (struct studente));if (s==NULL) return NULL;strcpy(s->cognome,cognome);strcpy(s->nome,nome);s->matricola = matricola; s->link = NULL;return s;

};

Page 192: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

26

Esempio: variabile dinamica singola

struct studente {char cognome[MAX], nome[MAX];int matricola; struct studente *link;

};struct studente *creaStud (

char *cognome, char *nome, int matricola) {

struct studente *s;s = malloc (sizeof (struct studente));if (s==NULL) return NULL;strcpy(s->cognome,cognome);strcpy(s->nome,nome);s->matricola = matricola; s->link = NULL;return s;

};

Si potrebbe scrivere anche:s = malloc (sizeof *s);

Page 193: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

27

Esempio: vettore dinamico

int *punt;int n;...scanf (“%d”, &n);...punt = malloc(n*sizeof(int));if (punt == NULL){

printf (“Errore di allocazione\n”);}else ...

Page 194: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

28

Esempio: vettore dinamico

int *punt;int n;...scanf (“%d”, &n);...punt = malloc(n*sizeof(int));if (punt == NULL){

printf (“Errore di allocazione\n”);}else ...

punt è un vettore dinamico di n interi

Page 195: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

29

De-allocazione mediante free (1/2)

La memoria allocata dinamicamente vienerestituita tramite la funzione free

La funzione di libreria free ha un prototipo simile al seguente

void free (void* p);

p punta alla memoria (precedentemente allocata) da liberare

La funzione non ritorna risultato

Page 196: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

30

De-allocazione mediante free (2/2)

Per usarla occorre includere <stdlib.h>

La funzione free viene di solito chiamataquando è terminato il lavoro sulla variabiledinamica, affinchè la memoria possa essereriutilizzata

Page 197: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

31

Esempio: vettore dinamico

int *punt;int i, n;...scanf (“%d”, &n);...punt = malloc(n*sizeof(int));...for (i=0; i<n; i++)punt[i] = ...;

...free(punt);

Page 198: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

I puntatori e l’allocazione dinamica di memoria

Page 199: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

2

Strutture dati dinamiche

Vettori dinamiciMatrici dinamicheListe

Page 200: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Strutture dati dinamiche

Page 201: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

4

Vettore dinamico

Si dice vettore dinamico un vettore la cui dimensione è nota solo in fase di esecuzione del programmaSoluzione

Puntatore, sfruttando la dualità puntatore-vettoreAllocazione mediante malloc

Rilascio mediante free

Per il resto, non cambia nulla rispetto al vettoresovradimensionato in modo statico

Page 202: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

5

Esempio

Acquisire da tastiera una serie di numeri reali, e memorizzarli in un vettore Stamparli successivamente in ordine inverso a quello di acquisizioneLa quantità di numeri non è nota al programmatore, né sovradimensionabile, ma èacquisita come primo dato da tastiera

Page 203: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

6

Esempio

Acquisire da tastiera una serie di numeri reali, e memorizzarli in un vettore Stamparli successivamente in ordine inverso a quello di acquisizioneLa quantità di numeri non è nota al programmatore, né sovradimensionabile, ma èacquisita come primo dato da tastiera

Attenzione! Per creare un vettore dinamico occorre conoscerne ladimensione prima di iniziare ad utilizzarlo.Se il numero di dati (ignoto) fosse segnalato da un terminatore (es. input del valore 0), non si potrebbe usare un vettore dinamico

Page 204: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

7

Soluzione (1/2)

float *v;int N, i;

printf(“Quanti elementi vuoi inserire ? ");scanf(“%d“,&N);

/* alloca vettore */v = malloc (N*(sizeof float));if (v==NULL) exit;

Invertio Ordine.c

Page 205: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

8

Soluzione (2/2)

/* input */printf("Inserisci %d elementi\n“, N);for (i=0; i<n; i++) {printf("Elemento %d: ", i+1) ;scanf("%f", &v[i]) ;

}/* output */printf(”Dati in ordine inverso\n”);for (i=n-1; i>=0; i--)printf("Elemento %d: %f", i+1, v[i]);

/* libera memoria dinamica */free(v);

Invertio Ordine.c

Page 206: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Strutture dati dinamiche

Page 207: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

10

Matrice dinamica (1/2)

Si dice matrice dinamica una matrice la cui dimensione è nota solo in fase di esecuzione del programmaSoluzione 1 (meno flessibile): vettore dinamico e organizzazione manuale di righe e colonne suvettore

Page 208: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

11

Matrice dinamica (2/2)

Soluzione 2: vettore dinamico di puntatori a righe(o dualmente vettore di puntatori a colonne) Puntatore, sfruttando la dualità puntatore-vettore

Allocazione dinamica del vettore di puntatoriIterazione di allocazione delle righe

Per il resto, non cambia nulla rispetto alla matricesovradimensionata in modo statico

Page 209: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

12

Esempio

Acquisire da tastiera una matrice di numeri reali, e memorizzarli in un vettore Stampare successivamente la matrice trasposta (righe e colonne scambiate di ruolo) Le dimensioni della matrice (righe e colonne) non sono note al programmatore, nésovradimensionabili, ma sono acquisite come primo dato da tastiera

Page 210: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

13

Soluzione con vettore dinamico (1/2)

float *m;int nr,nc,i,j;

printf(“Dimensioni (NR NC): ");scanf(“%d%d“, &nr, &nc);v = malloc (nr*nc*(sizeof float));if (v==NULL) exit;/* input */for (i=0; i<nr; i++) {printf("Inserisci riga %d\n“, i);for (j=0; j<nc; j++)scanf("%f", &v[nc*i+j]);

}

matriceTraspostaVettDyn.c

Page 211: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

14

Soluzione con vettore dinamico (2/2)

/* output */printf(”Matrice trasposta\n”);for (j=0; j<nc; j++)for (i=0; i<nr; i++)printf("%6.2f“, v[nc*i+j]);

/* libera memoria dinamica */free(v);

matriceTraspostaVettDyn.c

Page 212: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

15

Soluzione con matrice dinamica (1/3)

float **m;int nr,nc,i,j;

printf(“Dimensioni (NR NC): ");scanf(“%d%d“, &nr, &nc);

/* allocazione vettore di puntatori */v = malloc (nr*sizeof (float *));if (v==NULL) exit;

matriceTraspostaMatDyn.c

Page 213: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

16

Soluzione con matrice dinamica (2/3)

/* allocazione righe e input */for (i=0; i<nr; i++) {printf("Inserisci riga %d\n“, i);v[i] = malloc (nc*sizeof (float));if (v[i]==NULL) exit;for (j=0; j<nc; j++)scanf("%f", &(v[i][j]));

}

matriceTraspostaMatDyn.c

Page 214: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

17

Soluzione con matrice dinamica (3/3)

/* output */printf(”Matrice trasposta\n”);for (j=0; j<nc; j++)for (i=0; i<nr; i++)printf("%6.2f“, v[i][j]);

/* libera memoria dinamica */free(v);

matriceTraspostaMatDyn.c

Page 215: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Strutture dati dinamiche

Page 216: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

19

Lista concatenata (1/2)

Una lista è una struttura dati dinamicaconcatenata in cui

Ogni elemento conosce il successivoEsiste un elemento iniziale (testa) e uno finale (coda) della listaSi possono fare inserimenti, ricerche, estrazioni ed altre operazioni

Page 217: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

20

Lista concatenata (2/2)

Le liste non sono fornite dal linguaggio C come tipo predefinito, ma possono essere realizzatemediante strutture ricorsiveLa trattazione delle liste è al di la degli obiettivi di questo corso. Vediamo un esempio semplice

Page 218: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

21

Esercizio: problema di Giuseppe Flavio

N oggetti sono disposti in cerchio. Per semplicitàgli oggetti sono numerati da 1 a N (N viene acquisito da tastiera)Si elimina un oggetto ogni M (in senso antiorario) e si richiude il cerchioQuale oggetto rimane per ultimo? Con quale ordine si eliminano gli oggetti?

Page 219: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

22

Giuseppe Flavio dinamico: soluzione (1/2)

struct oggetto { int numero; struct oggetto *succ;

};int main(void){int i, N, M;struct oggetto *p, *x; /* genera primo oggetto */p=malloc(sizeof *p);p->numero=1; p->succ=p;x=p; /* x punta al primo oggetto */printf(“N = “); scanf(“%d”, &N);printf(“M = “); scanf(“%d”, &M);

GiuseppeFlavioDyn.c

Page 220: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

23

Giuseppe Flavio dinamico: soluzione (2/2)

for (i=2; i<=N; i++) {x = (x->succ = malloc(sizeof *x));x->numero = i; x->succ = p;

}while (p != p->succ) {for (i=1; i<M; i++) p = p->succ;printf(“Eliminato n.%d\n“,

p->succ->numero);x = p->succ; p->succ = p->succ->succ;free(x);

}printf(“Ultimo n.%d\n“, p->numero);

}

GiuseppeFlavioDyn.c

Page 221: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

I puntatori e l’allocazione dinamica di memoria

Page 222: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

2

Esercizi proposti

Esercizio “Mini-Editor”

Page 223: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

Esercizi proposti

Page 224: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

4

Esercizio “Mini-Editor”

Sia dato un file testo, contenente un certo numero (non noto) di righe, aventi ognuna non più di 80 caratteri (a-capo incluso)Si realizzi in C un programma che, acquisito da tastiera il nome del file, lo legga, immagazzinandone il contenuto in una opportuna struttura dati in memoria, quindi effettui mediante presentazione a menu (con comandi ricevuto da tastiera) una tra le operazioni seguenti

Page 225: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

5

Esercizio “Mini-Editor”: menu

Ricerca di una stringa nel testo (contando quante volte compare)Ricerca (stringa x) e sostituzione (con stringa y): ogni occorrenza di x nel testo viene sostituita da yVisualizza (da i a j): visualizza le righe dalla i-esima alla j-esima (incluse)Salva: salva il testo su un file (il cui nome va acquisito da tastieraEsci: fine del programma

Page 226: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

6

Struttura dati (1/2)

Vettore dinamico di stringhe (o matrice dinamica di caratteri)

È necessario in quanto occorre immagazzinare tutti i dati, sui cui fare più elaborazioni. Sarebbe possibile operare sulle singole righe, secondo lo schema (input – manipolazione – output), solo riscrivendo, per ogni comando, il risultato su un file (temporaneo) intermedioLa dimensione del vettore non è nota, ma può essere calcolata mediante una lettura preliminare del file

Page 227: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

7

Struttura dati (2/2)

Per ogni riga del file si alloca dinamicamente una stringa

La riga viene acquisita in un vettore (sovradimensionato) di lunghezza fissaSuccessivamente si alloca il vettore dinamico e vi si copia la riga di caratteri

La ricerca/sostituzione può richiedere una nuova stringa (di lunghezza diversa)

Page 228: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

8

Algoritmo

Input dei dati (tutti) da file a vettoreIterazione di esecuzione di comandi

menu = selezione dei possibili comandi, riconosciuti dal primo carattere (selezione a switch) formato

r <stringa>: ricerca <stringa>s <x> <y>: sostituisci <x> con <y> f <i> <j>: salva su file <f> da riga <i> a riga <j> (se <f> è “stdout” visualizza su video)u: uscita dal programma (fine)

Per semplicità si omettono controlli di errore su apertura file e fallita allocazione di memoria

Page 229: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

9

Mini-Editor (1/7)

const int MAXRIGA 80char **testo;int nrighe;

int leggiPagina(char *nomefile);int menu(void);void cerca (char *s)void sostituisci (char *s0, char *s1)void stampa (char *nomefile, int i, int j)int main(void){

char nomefile[MAXRIGA];printf(“nome file in ingresso: “);scanf(“%s”, nomefile);leggiPagina(nomefile);while (menu()!=0);

}

miniEditor.c

Page 230: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

10

Mini-Editor (1/7)

const int MAXRIGA 80char **testo;int nrighe;

int leggiPagina(char *nomefile);int menu(void);void cerca (char *s)void sostituisci (char *s0, char *s1)void stampa (char *nomefile, int i, int j)int main(void){

char nomefile[MAXRIGA];printf(“nome file in ingresso: “);scanf(“%s”, nomefile);leggiPagina(nomefile);while (menu()!=0);

}

Variabili globali, visibili a tutte le funzioni

miniEditor.c

Page 231: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

11

Mini-Editor (2/7)

int leggiPagina(char *nomefile){

FILE *fp;char s[MAXRIGA+1]; /* +1 per ’\0’ */int i;fp = fopen(nomefile,”r”);/* iterazione di conteggio righe */for (i=0; fgets(s,MAXRIGA,fp)!=NULL;i++);nrighe = i;/* chiude e riapre file */fclose(fp); fp = fopen(nomefile,”r”);/* alloca vettore dinamico */testo = malloc(nrighe*sizeof(char *));...

}

miniEditor.c

Page 232: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

12

Mini-Editor (3/7)

int leggiPagina(char *nomefile){

FILE *fp;char s[MAXRIGA+1]; /* +1 per ’\0’ */ int i;...

/* leggi righe */for (i=0; i<nrighe; i++) {

fgets(s,MAXRIGA,fp);if (buf[strlen(s)-1]==’\n’)

buf[strlen(s)-1] = ’\0’;testo[i]=malloc((strlen(s)+1)*sizeof(char));strcpy(testo[i],s);

}}

miniEditor.c

Page 233: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

13

Mini-Editor (3/7)

int leggiPagina(char *nomefile){

FILE *fp;char s[MAXRIGA+1]; /* +1 per ’\0’ */ int i;...

/* leggi righe */for (i=0; i<nrighe; i++) {

fgets(s,MAXRIGA,fp);if (buf[strlen(s)-1]==’\n’)

buf[strlen(s)-1] = ’\0’;testo[i]=malloc((strlen(s)+1)*sizeof(char));strcpy(testo[i],s);

}}

Lettura riga su stringa locale (la stessa per tutte le righe)

miniEditor.c

Page 234: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

14

Mini-Editor (3/7)

int leggiPagina(char *nomefile){

FILE *fp;char s[MAXRIGA+1]; /* +1 per ’\0’ */ int i;...

/* leggi righe */for (i=0; i<nrighe; i++) {

fgets(s,MAXRIGA,fp);if (buf[strlen(s)-1]==’\n’)

buf[strlen(s)-1] = ’\0’;testo[i]=malloc((strlen(s)+1)*sizeof(char));strcpy(testo[i],s);

}}

Elimina eventuale a-capo

miniEditor.c

Page 235: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

15

Mini-Editor (3/7)

int leggiPagina(char *nomefile){

FILE *fp;char s[MAXRIGA+1]; /* +1 per ’\0’ */ int i;...

/* leggi righe */for (i=0; i<nrighe; i++) {

fgets(s,MAXRIGA,fp);if (buf[strlen(s)-1]==’\n’)

buf[strlen(s)-1] = ’\0’;testo[i]=malloc((strlen(s)+1)*sizeof(char));strcpy(testo[i],s);

}}

Alloca i-esima riga (della lunghezza corretta) e copia contenuto

miniEditor.c

Page 236: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

16

Mini-Editor (4/7)

int menu (void){

char com[MAXRIGA], s0[MAXRIGA], s1[MAXRIGA]; int i, j;printf(“comando (r/s/f/u): “);gets(com);switch(com[0]) {

’r’:sscanf(com,”r %s”,s0); cerca(s0); break;

’s’:sscanf(com,”s %s%s”,s0,s1);

sostituisci(s0,s1); break;’f’:sscanf(com,”f %s%d%d”,s0,&i,&j);

stampa(s0,i,j); break;’u’: return 0;

}return 1;

}

miniEditor.c

Page 237: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

17

Mini-Editor (5/7)

void cerca (char *s){

int i, conta;char *riga;for (i=0; i<nrighe; i++) {

riga = testo[i];conta=0;while ((riga=strstr(riga,s))!=NULL)

{ conta++; riga++; }if (conta>0) {

printf(“Trovato %d volta/e in riga %d\n”,conta, i);

}}

}

miniEditor.c

Page 238: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

18

Mini-Editor (5/7)

void cerca (char *s){

int i, conta;char *riga;for (i=0; i<nrighe; i++) {

riga = testo[i];conta=0;while ((riga=strstr(riga,s))!=NULL)

{ conta++; riga++; }if (conta>0) {

printf(“Trovato %d volta/e in riga %d\n”,conta, i);

}}

}

Evita stringa appena trovata, incrementando riga al carattere successivo. Si accettano sovrapposizioni. Es. “aa” viene trovato 2 volte in “xaaay”

miniEditor.c

Page 239: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

19

Mini-Editor (6/7)

void sostituisci (char *s0, char *s1){

int i,l,l0=strlen(s0),l1=strlen(s1);char *riga, *nuova;for (i=0; i<nrighe; i++) {

riga = testo[i];while ((riga=strstr(riga,s))!=NULL) {

l = strlen(testo[i])+l1-l0;nuova = malloc((l+1)*sizeof(char));strncpy(nuova,testo[i],riga-testo[i]);strcat(nuova,s1); strcat(nuova,riga+l0);free(testa[i]); riga=testa[i]=nuova;

}}

}

miniEditor.c

Page 240: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

20

Mini-Editor (6/7)

void sostituisci (char *s0, char *s1){

int i,l,l0=strlen(s0),l1=strlen(s1);char *riga, *nuova;for (i=0; i<nrighe; i++) {

riga = testo[i];while ((riga=strstr(riga,s))!=NULL) {

l = strlen(testo[i])+l1-l0;nuova = malloc((l+1)*sizeof(char));strncpy(nuova,testo[i],riga-testo[i]);strcat(nuova,s1); strcat(nuova,riga+l0);free(testa[i]); riga=testa[i]=nuova;

}}

}

Puntatore a stringa iniziale o a sottostringa trovata in essa

miniEditor.c

Page 241: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

21

Mini-Editor (6/7)

void sostituisci (char *s0, char *s1){

int i,l,l0=strlen(s0),l1=strlen(s1);char *riga, *nuova;for (i=0; i<nrighe; i++) {

riga = testo[i];while ((riga=strstr(riga,s))!=NULL) {

l = strlen(testo[i])+l1-l0;nuova = malloc((l+1)*sizeof(char));strncpy(nuova,testo[i],riga-testo[i]);strcat(nuova,s1); strcat(nuova,riga+l0);free(testa[i]); riga=testa[i]=nuova;

}}

}

Puntatore a nuova stringa (eventualmente di lunghezza diversa)

miniEditor.c

Page 242: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

22

Mini-Editor (6/7)

void sostituisci (char *s0, char *s1){

int i,l,l0=strlen(s0),l1=strlen(s1);char *riga, *nuova;for (i=0; i<nrighe; i++) {

riga = testo[i];while ((riga=strstr(riga,s0))!=NULL) {

l = strlen(testo[i])+l1-l0;nuova = malloc((l+1)*sizeof(char));strncpy(nuova,testo[i],riga-testo[i]);strcat(nuova,s1); strcat(nuova,riga+l0);free(testa[i]); riga=testa[i]=nuova;

}}

}

miniEditor.c

Page 243: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

23

Mini-Editor (6/7)

void sostituisci (char *s0, char *s1){

int i,l,l0=strlen(s0),l1=strlen(s1);char *riga, *nuova;for (i=0; i<nrighe; i++) {

riga = testo[i];while ((riga=strstr(riga,s0))!=NULL) {

l = strlen(testo[i])+l1-l0;nuova = malloc((l+1)*sizeof(char));strncpy(nuova,testo[i],riga-testo[i]);strcat(nuova,s1); strcat(nuova,riga+l0);free(testa[i]); riga=testa[i]=nuova;

}}

}

Concatena 3 pezzi:- Parte iniziale (prima della sottostringa trovata)- Stringa s1- parte finale (dopo la sottostringa trovata)

miniEditor.c

Page 244: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

24

Mini-Editor (7/7)

void stampa (char *nomefile, int i, int j){

FILE *fp;int k;

if (strcmp(nomefile,”stdout”)==0)fp = stdout;

elsefp = fopen(nomefile,”w”);

if (j>=nrighe) j=nrighe-1;

for (k=i; k<=j; k++)fprintf(fp,”%s\n”,testo[k]);

if (fp != stdout) fclose(fp)}

miniEditor.c

Page 245: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

I puntatori e l’allocazione dinamica di memoria

Page 246: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

2

Argomenti trattati

Il puntatore come dato e riferimento datoVariabili e operatori sui puntatoriUtilizzo avanzato dei puntatori con

Vettori e matriciStrutture

L’allocazione dinamica di memoria e le strutture dati dinamicheEsercizi

Page 247: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

3

Tecniche di programmazione

Gestione di riferimenti a dati privi di nomeManipolazione dei puntatori e aritmeticaParametri per riferimentoStrutture puntateVettori e matrici dinamiche

Page 248: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

4

Suggerimenti

I puntatori sono un efficace strumento perParametri per riferimentoAllocazione dinamica (esplicita) di dati

VantaggiAccesso a dati altrimenti non manipolabili (mediante nome)Maggior flessibilità e possibilità di gestire meglio la memoria disponibilePossibilità di adattare la dimensione dei dati all’input del programma (in esecuzione)

Page 249: Programmazione in Cfmgroup.polito.it/cabodi/pub/dida/apa/2008/lucidi lezioni/ripasso-c... · 4 Il tipo di dato puntatore Identificare una variabile in C I puntatori come riferimento

5

Materiale aggiuntivo

Sul CD-ROMTesti e soluzioni degli esercizi trattati nei lucidiScheda sinteticaEsercizi risoltiEsercizi proposti

Esercizi proposti da altri libri di testo