lezione 6 laboratorio di programmazione...
TRANSCRIPT
![Page 1: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/1.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Puntatori e Aritmetica dei puntatoriLezione 6
Laboratorio di Programmazione I
Corso di Laurea in InformaticaA.A. 2019/2020
![Page 2: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/2.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Argomenti del Corso
Ogni lezione consta di una spiegazione assistita da slide, eseguita da esercizi in classe
Introduzione all’ambiente LinuxIntroduzione al CTipi primitivi e costrutti condizionaliCostrutti iterativi ed arrayFunzioni, stack e visibilità variabiliPuntatori e memoriaDebuggingTipi di dati utenteListe concatenate e librerieRicorsione
![Page 3: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/3.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Sommario
1 PuntatoriVariabili puntatoreAritmetica dei puntatori
2 Puntatori e funzioniPassaggio per riferimento
3 Array Multidimensionali
![Page 4: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/4.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Errori comuni
# inc lude <s td io ># de f ine N 10
void f ( i n t [ ] a ) {. . .
}
i n t main ( ) {i n t a [N ] ;f ( a [N ] ) ;r e t u r n 0 ;
}
f(a) invece di f(a[N])
![Page 5: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/5.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Errori comuni
# inc lude <s td io ># de f ine N 10
void f ( i n t [ ] a ) {. . .
}
i n t main ( ) {i n t a [N ] ;f ( a [N ] ) ;r e t u r n 0 ;
}
f(a) invece di f(a[N])
![Page 6: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/6.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Errori comuni
f l o a t f ( ) {. . .
}
i n t main ( ) {p r i n t f ( "%d \ n " , f ( ) ) ;r e t u r n 0 ;
}
%f invece di %d
![Page 7: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/7.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Errori comuni
f l o a t f ( ) {. . .
}
i n t main ( ) {p r i n t f ( "%d \ n " , f ( ) ) ;r e t u r n 0 ;
}
%f invece di %d
![Page 8: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/8.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Errori comuni
i n t main ( ) {i n t somma, num_valor i ;. . . . .p r i n t f ( " %.2 f \ n " , somma / num_valor i ) ;r e t u r n 0 ;
}
somma / (float) num_valori
![Page 9: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/9.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Errori comuni
i n t main ( ) {i n t somma, num_valor i ;. . . . .p r i n t f ( " %.2 f \ n " , somma / num_valor i ) ;r e t u r n 0 ;
}
somma / (float) num_valori
![Page 10: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/10.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Outline
1 PuntatoriVariabili puntatoreAritmetica dei puntatori
2 Puntatori e funzioniPassaggio per riferimento
3 Array Multidimensionali
![Page 11: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/11.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Indirizzi di Memoria e Puntatori
In C è possibile conoscere l’indirizzo della cella di memoriain cui è memorizzata una variabile (o una funzione!!)
Operatore unario & restituisce l’indirizzo di memoria di unavariabile, e.g &x
Puntatore: variabile che denota un indirizzo di memorianello spazio di indirizzamento del processo
![Page 12: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/12.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Variabili Puntatore
i n t a = 10; / / a e ’ una v a r i a b i l e i n t e r a ( i n i z . a 10)
![Page 13: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/13.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Variabili Puntatore
i n t a = 10; / / a e ’ una v a r i a b i l e i n t e r a ( i n i z . a 10)i n t ∗b ; / / b e ’ una v a r i a b i l e punta tore ad i n t e r i
![Page 14: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/14.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Variabili Puntatore
i n t a = 10; / / a e ’ una v a r i a b i l e i n t e r a ( i n i z . a 10)i n t ∗b ; / / b e ’ una v a r i a b i l e punta tore ad i n t e r ib = &a ; / / b cont iene l ’ i n d i r i z z o d i memoria d i a
![Page 15: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/15.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Variabili Puntatore
i n t a = 10; / / a e ’ una v a r i a b i l e i n t e r a ( i n i z . a 10)i n t ∗b ; / / b e ’ una v a r i a b i l e punta tore ad i n t e r ib = &a ; / / b cont iene l ’ i n d i r i z z o d i memoria d i a. . .
/ / A t t rave rso l ’ i n d i r i z z o d i memoria possomanipolare i l contenuto d i una v a r i a b i l e∗b = ∗b − 2;
![Page 16: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/16.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Variabili Puntatore
i n t a = 10; / / a e ’ una v a r i a b i l e i n t e r a ( i n i z . a 10)i n t ∗b ; / / b e ’ una v a r i a b i l e punta tore ad i n t e r ib = &a ; / / b cont iene l ’ i n d i r i z z o d i memoria d i a. . .
/ / A t t rave rso l ’ i n d i r i z z o d i memoria possomanipolare i l contenuto d i una v a r i a b i l e∗b = ∗b − 2;
![Page 17: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/17.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Dichiarare ed operare sui puntatori
nometipo * var
Dichiara:una variabile puntatore con nome var
e tipo: indirizzo di variabile di tipo nometipo
L’operatore & viene usato per restituire l’indirizzo di unavariabile
b = &a;Lo posso usare per ottenere l’indirizzo di una variabilepuntatore, e.g. &b!!
L’operatore * viene usato per accedere al contenuto di unindirizzo di memoria memorizzato da un puntatore(dereferenziazione)
*b = *b - 2;
![Page 18: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/18.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Dichiarare ed operare sui puntatori
nometipo * var
Dichiara:una variabile puntatore con nome var
e tipo: indirizzo di variabile di tipo nometipo
L’operatore & viene usato per restituire l’indirizzo di unavariabile
b = &a;Lo posso usare per ottenere l’indirizzo di una variabilepuntatore, e.g. &b!!
L’operatore * viene usato per accedere al contenuto di unindirizzo di memoria memorizzato da un puntatore(dereferenziazione)
*b = *b - 2;
![Page 19: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/19.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
I due usi del simbolo *
Usato nella dichiarazione significa che la variabile è di tipopuntatore a
int *a;int **c;
Usato nei comandi invece esegue la dereferenziazione:accesso alla variabile puntata, in particolare:
all’interno di un espressione, da accesso al contenutodell’indirizzo di memoria puntato
if (*a > 10) { ... } else { ... }
a sinistra dell’assegnamento, permette di modificare ilcontenuto dell’indirizzo di memoria puntato
*a = 10;
![Page 20: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/20.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
I due usi del simbolo *
Usato nella dichiarazione significa che la variabile è di tipopuntatore a
int *a;int **c;
Usato nei comandi invece esegue la dereferenziazione:accesso alla variabile puntata, in particolare:
all’interno di un espressione, da accesso al contenutodell’indirizzo di memoria puntato
if (*a > 10) { ... } else { ... }
a sinistra dell’assegnamento, permette di modificare ilcontenuto dell’indirizzo di memoria puntato
*a = 10;
![Page 21: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/21.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
I due usi del simbolo *
Usato nella dichiarazione significa che la variabile è di tipopuntatore a
int *a;int **c;
Usato nei comandi invece esegue la dereferenziazione:accesso alla variabile puntata, in particolare:
all’interno di un espressione, da accesso al contenutodell’indirizzo di memoria puntato
if (*a > 10) { ... } else { ... }
a sinistra dell’assegnamento, permette di modificare ilcontenuto dell’indirizzo di memoria puntato
*a = 10;
![Page 22: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/22.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
I due usi del simbolo *
Usato nella dichiarazione significa che la variabile è di tipopuntatore a
int *a;int **c;
Usato nei comandi invece esegue la dereferenziazione:accesso alla variabile puntata, in particolare:
all’interno di un espressione, da accesso al contenutodell’indirizzo di memoria puntato
if (*a > 10) { ... } else { ... }
a sinistra dell’assegnamento, permette di modificare ilcontenuto dell’indirizzo di memoria puntato
*a = 10;
![Page 23: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/23.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Operatori di dereferenziamento * e di indirizzo &
hanno priorità più elevata degli operatori binari
* è associativo a destra: **p è equivalente a *(*p)
& può essere applicato solo ad una variabile;&a non è una variabile quindi & non è associativo* e & sono uno l’inverso dell’altro
data la dichiarazione int a;
*&a è un altro modo per denotare a (sono entrambivariabili)data la dichiarazione int *pi;&*pi ha valore (un indirizzo) uguale al valore di piperò:• pi è una variabile• &*pi non lo è (ad esempio, non può essere usato asinistra di =)
![Page 24: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/24.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Operatori di dereferenziamento * e di indirizzo &
hanno priorità più elevata degli operatori binari
* è associativo a destra: **p è equivalente a *(*p)
& può essere applicato solo ad una variabile;&a non è una variabile quindi & non è associativo* e & sono uno l’inverso dell’altro
data la dichiarazione int a;
*&a è un altro modo per denotare a (sono entrambivariabili)data la dichiarazione int *pi;&*pi ha valore (un indirizzo) uguale al valore di piperò:• pi è una variabile• &*pi non lo è (ad esempio, non può essere usato asinistra di =)
![Page 25: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/25.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Operatori di dereferenziamento * e di indirizzo &
hanno priorità più elevata degli operatori binari
* è associativo a destra: **p è equivalente a *(*p)
& può essere applicato solo ad una variabile;&a non è una variabile quindi & non è associativo
* e & sono uno l’inverso dell’altro
data la dichiarazione int a;
*&a è un altro modo per denotare a (sono entrambivariabili)data la dichiarazione int *pi;&*pi ha valore (un indirizzo) uguale al valore di piperò:• pi è una variabile• &*pi non lo è (ad esempio, non può essere usato asinistra di =)
![Page 26: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/26.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Operatori di dereferenziamento * e di indirizzo &
hanno priorità più elevata degli operatori binari
* è associativo a destra: **p è equivalente a *(*p)
& può essere applicato solo ad una variabile;&a non è una variabile quindi & non è associativo* e & sono uno l’inverso dell’altro
data la dichiarazione int a;
*&a è un altro modo per denotare a (sono entrambivariabili)data la dichiarazione int *pi;&*pi ha valore (un indirizzo) uguale al valore di piperò:• pi è una variabile• &*pi non lo è (ad esempio, non può essere usato asinistra di =)
![Page 27: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/27.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Operatori di dereferenziamento * e di indirizzo &
hanno priorità più elevata degli operatori binari
* è associativo a destra: **p è equivalente a *(*p)
& può essere applicato solo ad una variabile;&a non è una variabile quindi & non è associativo* e & sono uno l’inverso dell’altro
data la dichiarazione int a;
*&a è un altro modo per denotare a (sono entrambivariabili)
data la dichiarazione int *pi;&*pi ha valore (un indirizzo) uguale al valore di piperò:• pi è una variabile• &*pi non lo è (ad esempio, non può essere usato asinistra di =)
![Page 28: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/28.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Operatori di dereferenziamento * e di indirizzo &
hanno priorità più elevata degli operatori binari
* è associativo a destra: **p è equivalente a *(*p)
& può essere applicato solo ad una variabile;&a non è una variabile quindi & non è associativo* e & sono uno l’inverso dell’altro
data la dichiarazione int a;
*&a è un altro modo per denotare a (sono entrambivariabili)data la dichiarazione int *pi;&*pi ha valore (un indirizzo) uguale al valore di piperò:• pi è una variabile• &*pi non lo è (ad esempio, non può essere usato asinistra di =)
![Page 29: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/29.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Operatori di dereferenziamento * e di indirizzo &
![Page 30: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/30.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Operatori di dereferenziamento * e di indirizzo &
![Page 31: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/31.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Operatori di dereferenziamento * e di indirizzo &
![Page 32: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/32.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Puntatori e tipi
E’ possibile dichiarare puntatori per tutti i tipi primitivi (e anchele strutture)
i n t ∗a , ∗b ; / / D ich ia raz ione m u l t i p l a ( r i p e t e r e ‘ ∗ ’ )f l o a t ∗c , d ; / / c e ’ un punta tore a f l o a t , d e ’ unav a r i a b i l e f l o a t
double h ,∗e , ∗∗ f ; / / f e ’ un punta tore a punta tore adouble. . .e= &h ; / / l a sequenza d i assegnamenti e ’ c o r r e t t a
f = &e ;
Che tipo ha *e? E *f e **f?NULL: costante predefinita (in stdio.h) che denota ilpuntatore nullo
![Page 33: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/33.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Puntatori e tipi
E’ possibile dichiarare puntatori per tutti i tipi primitivi (e anchele strutture)
i n t ∗a , ∗b ; / / D ich ia raz ione m u l t i p l a ( r i p e t e r e ‘ ∗ ’ )f l o a t ∗c , d ; / / c e ’ un punta tore a f l o a t , d e ’ unav a r i a b i l e f l o a t
double h ,∗e , ∗∗ f ; / / f e ’ un punta tore a punta tore adouble. . .e= &h ; / / l a sequenza d i assegnamenti e ’ c o r r e t t a
f = &e ;
Che tipo ha *e? E *f e **f?NULL: costante predefinita (in stdio.h) che denota ilpuntatore nullo
![Page 34: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/34.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Puntatori e tipi
E’ possibile dichiarare puntatori per tutti i tipi primitivi (e anchele strutture)
i n t ∗a , ∗b ; / / D ich ia raz ione m u l t i p l a ( r i p e t e r e ‘ ∗ ’ )f l o a t ∗c , d ; / / c e ’ un punta tore a f l o a t , d e ’ unav a r i a b i l e f l o a t
double h ,∗e , ∗∗ f ; / / f e ’ un punta tore a punta tore adouble. . .e= &h ; / / l a sequenza d i assegnamenti e ’ c o r r e t t a
f = &e ;
Che tipo ha *e? E *f e **f?NULL: costante predefinita (in stdio.h) che denota ilpuntatore nullo
![Page 35: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/35.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Puntatori e tipi
E’ possibile dichiarare puntatori per tutti i tipi primitivi (e anchele strutture)
i n t ∗a , ∗b ; / / D ich ia raz ione m u l t i p l a ( r i p e t e r e ‘ ∗ ’ )f l o a t ∗c , d ; / / c e ’ un punta tore a f l o a t , d e ’ unav a r i a b i l e f l o a t
double h ,∗e , ∗∗ f ; / / f e ’ un punta tore a punta tore adouble. . .e= &h ; / / l a sequenza d i assegnamenti e ’ c o r r e t t a
f = &e ;
Che tipo ha *e? E *f e **f?
NULL: costante predefinita (in stdio.h) che denota ilpuntatore nullo
![Page 36: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/36.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Puntatori e tipi
E’ possibile dichiarare puntatori per tutti i tipi primitivi (e anchele strutture)
i n t ∗a , ∗b ; / / D ich ia raz ione m u l t i p l a ( r i p e t e r e ‘ ∗ ’ )f l o a t ∗c , d ; / / c e ’ un punta tore a f l o a t , d e ’ unav a r i a b i l e f l o a t
double h ,∗e , ∗∗ f ; / / f e ’ un punta tore a punta tore adouble. . .e= &h ; / / l a sequenza d i assegnamenti e ’ c o r r e t t a
f = &e ;
Che tipo ha *e? E *f e **f?NULL: costante predefinita (in stdio.h) che denota ilpuntatore nullo
![Page 37: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/37.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Costanti e puntatori
Queste due dichiarazioni sono equivalenti, cioè puntatori acostanti intere
const i n t ∗a ;i n t const ∗a ;
Non potete fare *a = 10!
const i n t ∗a ; / / Puntatore a c o s t a n t i i n t e r ei n t ∗const a ; / / Puntatore costante ad i n t e r i
Non sono equivalenti!!! Nel secondo caso non potetemodificare l’indirizzo a cui punta a, ma potete cambiare il suocontenuto con *a!
![Page 38: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/38.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Costanti e puntatori
Queste due dichiarazioni sono equivalenti, cioè puntatori acostanti intere
const i n t ∗a ;i n t const ∗a ;
Non potete fare *a = 10!
const i n t ∗a ; / / Puntatore a c o s t a n t i i n t e r ei n t ∗const a ; / / Puntatore costante ad i n t e r i
Non sono equivalenti!!! Nel secondo caso non potetemodificare l’indirizzo a cui punta a, ma potete cambiare il suocontenuto con *a!
![Page 39: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/39.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Costanti e puntatori
Queste due dichiarazioni sono equivalenti, cioè puntatori acostanti intere
const i n t ∗a ;i n t const ∗a ;
Non potete fare *a = 10!
const i n t ∗a ; / / Puntatore a c o s t a n t i i n t e r ei n t ∗const a ; / / Puntatore costante ad i n t e r i
Non sono equivalenti!!! Nel secondo caso non potetemodificare l’indirizzo a cui punta a, ma potete cambiare il suocontenuto con *a!
![Page 40: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/40.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Aritmetica dei puntatori
E’ possibile utilizzare alcuni degli operatori aritmetici classici(+,-,++,-, ...) per scrivere espressioni con i puntatori
i n t a [ 4 ] , ∗p ; / / D ich ia ro un ar ray d i i n t e r i ed unpunta tore ad i n t e r i
![Page 41: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/41.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Aritmetica dei puntatori
E’ possibile utilizzare alcuni degli operatori aritmetici classici(+,-,++,-, ...) per scrivere espressioni con i puntatori
i n t a [ 4 ] , ∗p ; / / D ich ia ro un ar ray d i i n t e r i ed unpunta tore ad i n t e r i
![Page 42: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/42.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Aritmetica dei puntatori
E’ possibile utilizzare alcuni degli operatori aritmetici classici(+,-,++,-, ...) per scrivere espressioni con i puntatori
i n t a [ 4 ] , ∗p ; / / D ich ia ro un ar ray d i i n t e r i ed unpunta tore ad i n t e r i
![Page 43: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/43.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Aritmetica dei puntatori
E’ possibile utilizzare alcuni degli operatori aritmetici classici(+,-,++,-, ...) per scrivere espressioni con i puntatori
i n t a [ 4 ] , ∗p ; / / D ich ia ro un ar ray d i i n t e r i ed unpunta tore ad i n t e r i
![Page 44: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/44.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Aritmetica dei puntatori I
E’ possibile utilizzare alcuni degli operatori aritmetici classici(+,-,++,-, ...) per scrivere espressioni con i puntatori
i n t a [ 4 ] , ∗p ; / / D ich ia ro un ar ray d i i n t e r i ed unpunta tore ad i n t e r i
![Page 45: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/45.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Aritmetica dei puntatori II
Il valore calcolato in corrispondenza di un’operazione del tipop+i dipende dal tipo T di p (analog. per p-i):
Op. Logica: p = p+1 Op.Algebrica: p = p + sizeof(T)
i n t ∗ p i ;∗ p i = 15;p i = p i +1; /∗ p i punta a l prossimo i n t (4 byte dopo ) ∗ /
double ∗pd ;∗pd = 12 .2 ;pd = pd+3; /∗ pd punta a 3 double dopo (24 byte dopo ) ∗ /
char ∗pc ;∗pc = ’A ’ ;pc = pc − 5; /∗ pc punta a 5 char prima (5 byte prima ) ∗ /
![Page 46: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/46.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Aritmetica dei puntatori II
Il valore calcolato in corrispondenza di un’operazione del tipop+i dipende dal tipo T di p (analog. per p-i):
Op. Logica: p = p+1 Op.Algebrica: p = p + sizeof(T)
i n t ∗ p i ;∗ p i = 15;p i = p i +1; /∗ p i punta a l prossimo i n t (4 byte dopo ) ∗ /
double ∗pd ;∗pd = 12 .2 ;pd = pd+3; /∗ pd punta a 3 double dopo (24 byte dopo ) ∗ /
char ∗pc ;∗pc = ’A ’ ;pc = pc − 5; /∗ pc punta a 5 char prima (5 byte prima ) ∗ /
![Page 47: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/47.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Aritmetica dei puntatori II
Il valore calcolato in corrispondenza di un’operazione del tipop+i dipende dal tipo T di p (analog. per p-i):
Op. Logica: p = p+1 Op.Algebrica: p = p + sizeof(T)
i n t ∗ p i ;∗ p i = 15;p i = p i +1; /∗ p i punta a l prossimo i n t (4 byte dopo ) ∗ /
double ∗pd ;∗pd = 12 .2 ;pd = pd+3; /∗ pd punta a 3 double dopo (24 byte dopo ) ∗ /
char ∗pc ;∗pc = ’A ’ ;pc = pc − 5; /∗ pc punta a 5 char prima (5 byte prima ) ∗ /
![Page 48: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/48.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Aritmetica dei puntatori II
Il valore calcolato in corrispondenza di un’operazione del tipop+i dipende dal tipo T di p (analog. per p-i):
Op. Logica: p = p+1 Op.Algebrica: p = p + sizeof(T)
i n t ∗ p i ;∗ p i = 15;p i = p i +1; /∗ p i punta a l prossimo i n t (4 byte dopo ) ∗ /
double ∗pd ;∗pd = 12 .2 ;pd = pd+3; /∗ pd punta a 3 double dopo (24 byte dopo ) ∗ /
char ∗pc ;∗pc = ’A ’ ;pc = pc − 5; /∗ pc punta a 5 char prima (5 byte prima ) ∗ /
![Page 49: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/49.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Puntatori ed array (I)
In generale non sappiamo cosa contengono le celle di memoriaadiacenti ad una data cella.L’unico caso in cui lo sappiamo è quando utilizziamo dei vettori.Il nome di un array è un puntatore costante al primo elementodel vettore (int *const)
i n t a [ 4 ] , ∗p ;/ / I due comandi che seguono , sono e q u i v a l e n t ip = &a [ 0 ] ; / / I n d i r i z z o de l primo elemento d e l l ’ a r rayp = a ; / / Puntatore a l ( primo elemento de l ) a r ray
L’operatore array[·] è un’abbreviazione per un’operazionearitmetica su puntatori
i n t tmp ;/ / I due assegnamenti che seguono sono e q u i v a l e n t itmp = a [ 2 ] ; / / Terzo elemento d e l l ’ a r raytmp = ∗ ( a+2) ; / / Contenuto d e l l ’ i n d i r i z z o puntato da a +
(2 ∗ s i z e o f ( i n t ) )
![Page 50: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/50.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Puntatori ed array (I)
In generale non sappiamo cosa contengono le celle di memoriaadiacenti ad una data cella.L’unico caso in cui lo sappiamo è quando utilizziamo dei vettori.Il nome di un array è un puntatore costante al primo elementodel vettore (int *const)
i n t a [ 4 ] , ∗p ;/ / I due comandi che seguono , sono e q u i v a l e n t ip = &a [ 0 ] ; / / I n d i r i z z o de l primo elemento d e l l ’ a r rayp = a ; / / Puntatore a l ( primo elemento de l ) a r ray
L’operatore array[·] è un’abbreviazione per un’operazionearitmetica su puntatori
i n t tmp ;/ / I due assegnamenti che seguono sono e q u i v a l e n t itmp = a [ 2 ] ; / / Terzo elemento d e l l ’ a r raytmp = ∗ ( a+2) ; / / Contenuto d e l l ’ i n d i r i z z o puntato da a +
(2 ∗ s i z e o f ( i n t ) )
![Page 51: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/51.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Puntatori ed array (I)
In generale non sappiamo cosa contengono le celle di memoriaadiacenti ad una data cella.L’unico caso in cui lo sappiamo è quando utilizziamo dei vettori.Il nome di un array è un puntatore costante al primo elementodel vettore (int *const)
i n t a [ 4 ] , ∗p ;/ / I due comandi che seguono , sono e q u i v a l e n t ip = &a [ 0 ] ; / / I n d i r i z z o de l primo elemento d e l l ’ a r rayp = a ; / / Puntatore a l ( primo elemento de l ) a r ray
L’operatore array[·] è un’abbreviazione per un’operazionearitmetica su puntatori
i n t tmp ;/ / I due assegnamenti che seguono sono e q u i v a l e n t itmp = a [ 2 ] ; / / Terzo elemento d e l l ’ a r raytmp = ∗ ( a+2) ; / / Contenuto d e l l ’ i n d i r i z z o puntato da a +
(2 ∗ s i z e o f ( i n t ) )
![Page 52: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/52.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Puntatori ed array (II)
Un esempio che riassume i modi in cui si può accedere aglielementi di un vettore.
i n t ve t [ ] = {11 , 22 , 33 , 44 , 55 } ;i n t ∗ p i = vet , o f f s e t = 3 ;
/∗ i seguent i assegnamenti sono e q u i v a l e n t i ∗ /
ve t [ o f f s e t ] = 88;∗ ( ve t + o f f s e t ) = 88;p i [ o f f s e t ] = 88;∗ ( p i + o f f s e t ) = 88;
![Page 53: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/53.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Puntatori ed array (III)
# def ine DIM 100
i n t a [ DIM ] ,∗p , i ;
/∗Modi a l t e r n a t i v i per scandi re un v e t t o r e ∗ /
f o r ( i =0; i <DIM ; i ++) f o r ( i =0; i <DIM ; i ++)p r i n t f ( "%d " , a [ i ] ) ; p r i n t f ( "%d " , p [ i ] ) ;
f o r ( i =0; i <DIM ; i ++) f o r ( i =0; i <DIM ; i ++)p r i n t f ( "%d " , ∗ ( a+ i ) ) ; p r i n t f ( "%d " , ∗ ( p+ i ) ) ;
f o r ( p=a ; p<a+DIM ; p++)p r i n t f ( "%d " , ∗p ) ;
![Page 54: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/54.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Il Codice che non Compila!!! Perchè?
# def ine DIM 100i n t a [ DIM ] , ∗p ;f o r ( p=a ; a<p+DIM ; a++) /∗Non compila ! Perche? ∗ /
p r i n t f ( "%d " , ∗a ) ;
int a[DIM] dichiara un puntatore costante a interi (int *const)=⇒ Non posso modificare dove punta a!
![Page 55: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/55.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Il Codice che non Compila!!! Perchè?
# def ine DIM 100i n t a [ DIM ] , ∗p ;f o r ( p=a ; a<p+DIM ; a++) /∗Non compila ! Perche? ∗ /
p r i n t f ( "%d " , ∗a ) ;
int a[DIM] dichiara un puntatore costante a interi (int *const)=⇒ Non posso modificare dove punta a!
![Page 56: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/56.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Cast esplicito
E’ possibile fare il cast esplicito di un puntatore ad un qualsiasialtro tipo di puntatore
i n t a = 8 ;i n t ∗b ; / / Puntatore a i n t e r idouble ∗c ; / / Puntatore a double. . .b = &a ;c = ( double ∗ ) b ;
Che succede se ora dereferenzio c?
![Page 57: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/57.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Cast esplicito
E’ possibile fare il cast esplicito di un puntatore ad un qualsiasialtro tipo di puntatore
i n t a = 8 ;i n t ∗b ; / / Puntatore a i n t e r idouble ∗c ; / / Puntatore a double. . .b = &a ;c = ( double ∗ ) b ;
Che succede se ora dereferenzio c?
![Page 58: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/58.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Cast esplicito
E’ possibile fare il cast esplicito di un puntatore ad un qualsiasialtro tipo di puntatore
i n t a = 8 ;i n t ∗b ; / / Puntatore a i n t e r idouble ∗c ; / / Puntatore a double. . .b = &a ;c = ( double ∗ ) b ;
Che succede se ora dereferenzio c?
![Page 59: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/59.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Segmentation Fault!!! Perchè?
![Page 60: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/60.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Violazione memoria con cast esplicito
![Page 61: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/61.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Violazione memoria con cast esplicito
![Page 62: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/62.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Variabili puntatoreAritmetica dei puntatori
Violazione memoria con cast esplicito
![Page 63: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/63.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Outline
1 PuntatoriVariabili puntatoreAritmetica dei puntatori
2 Puntatori e funzioniPassaggio per riferimento
3 Array Multidimensionali
![Page 64: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/64.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Passaggio dei parametri - Valore
I parametri delle funzioni C sono passati per valoreIl loro valore viene copiato sullo stackOgni modifica del parametro nel corpo della funzione nonmodifica l’originale
vo id swap ( i n t a , i n t b ) {i n t c = a ;a = b ;b = c ;
}vo id main ( ) {
. . .swap ( x , y ) ;
}
swap non scambia il contenuto di x,y perchè lo scambio vienefatto sulle copie!
![Page 65: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/65.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Passaggio dei parametri - Valore
I parametri delle funzioni C sono passati per valoreIl loro valore viene copiato sullo stackOgni modifica del parametro nel corpo della funzione nonmodifica l’originale
vo id swap ( i n t a , i n t b ) {i n t c = a ;a = b ;b = c ;
}vo id main ( ) {
. . .swap ( x , y ) ;
}
swap non scambia il contenuto di x,y perchè lo scambio vienefatto sulle copie!
![Page 66: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/66.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Passaggio dei parametri - Valore
I parametri delle funzioni C sono passati per valoreIl loro valore viene copiato sullo stackOgni modifica del parametro nel corpo della funzione nonmodifica l’originale
vo id swap ( i n t a , i n t b ) {i n t c = a ;a = b ;b = c ;
}vo id main ( ) {
. . .swap ( x , y ) ;
}
swap non scambia il contenuto di x,y perchè lo scambio vienefatto sulle copie!
![Page 67: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/67.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Passaggio per Riferimento
Possiamo sfruttare i puntatori per realizzare una versionefunzionante di swap (passaggio per riferimento)
vo id swap ( i n t ∗a , i n t ∗b ) {i n t c = ∗a ;∗a = ∗b ;∗b = c ;
}vo id main ( ) {
. . .swap(&x ,&y ) ;
}
Nello stack viene copiato l’indirizzo di memoria di x e y.Le modifiche eseguite da swap vengono fatte andando ascrivere nell’indirizzo di memoria di x e y e sono quindidisponibili all’uscita della funzione.
![Page 68: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/68.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Passaggio per Riferimento
Possiamo sfruttare i puntatori per realizzare una versionefunzionante di swap (passaggio per riferimento)
vo id swap ( i n t ∗a , i n t ∗b ) {i n t c = ∗a ;∗a = ∗b ;∗b = c ;
}vo id main ( ) {
. . .swap(&x ,&y ) ;
}
Nello stack viene copiato l’indirizzo di memoria di x e y.Le modifiche eseguite da swap vengono fatte andando ascrivere nell’indirizzo di memoria di x e y e sono quindidisponibili all’uscita della funzione.
![Page 69: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/69.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Passaggio per Riferimento
Possiamo sfruttare i puntatori per realizzare una versionefunzionante di swap (passaggio per riferimento)
vo id swap ( i n t ∗a , i n t ∗b ) {i n t c = ∗a ;∗a = ∗b ;∗b = c ;
}vo id main ( ) {
. . .swap(&x ,&y ) ;
}
Nello stack viene copiato l’indirizzo di memoria di x e y.Le modifiche eseguite da swap vengono fatte andando ascrivere nell’indirizzo di memoria di x e y e sono quindidisponibili all’uscita della funzione.
![Page 70: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/70.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Passaggio per Riferimento - Array
Attenzione! Gli array sono sempre passati per riferimento
Si passa il nome dell’array, che è un puntatore al primoelementoOgni modifica ad elementi dell’array eseguita nel corpo diuna funzione modifica anche l’originale
Le segnature
void arrayFun(int x[])
void arrayFun(int *x)
sono del tutto equivalenti (tipicamente si usa la prima perleggibilità)
![Page 71: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/71.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Passaggio per Riferimento - Array
Attenzione! Gli array sono sempre passati per riferimento
Si passa il nome dell’array, che è un puntatore al primoelementoOgni modifica ad elementi dell’array eseguita nel corpo diuna funzione modifica anche l’originale
Le segnature
void arrayFun(int x[])
void arrayFun(int *x)
sono del tutto equivalenti (tipicamente si usa la prima perleggibilità)
![Page 72: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/72.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Passaggio per Riferimento - Array
Attenzione! Gli array sono sempre passati per riferimento
Si passa il nome dell’array, che è un puntatore al primoelementoOgni modifica ad elementi dell’array eseguita nel corpo diuna funzione modifica anche l’originale
Le segnature
void arrayFun(int x[])
void arrayFun(int *x)
sono del tutto equivalenti (tipicamente si usa la prima perleggibilità)
![Page 73: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/73.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Esempio
Problema: calcolarei=DIM−1∑
i=0
|array [i]|.
i n t sumabs ( i n t ∗a , i n t dim ) {i n t i , somma;f o r ( i =0; i <dim ; i ++)
i f ( a [ i ] <0)a [ i ]=−a [ i ] ;
f o r ( i =0; i <dim ; i ++)somma=somma+a [ i ] ;
r e t u r n somma;}vo id main ( ) {
. . .somma= sumabs ( array , DIM) ;
p r i n t f ( " Stampa d i ar ray : \ n " ) ;f o r ( i =0; i <DIM ; i ++)
p r i n t f ( "%d " , a r ray [ i ] ) ; /∗Cosa stampa? ∗ /}
![Page 74: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/74.jpg)
PuntatoriPuntatori e funzioni
Array MultidimensionaliPassaggio per riferimento
Esempio
Problema: calcolarei=DIM−1∑
i=0
|array [i]|.
i n t sumabs ( i n t ∗a , i n t dim ) {i n t i , somma;f o r ( i =0; i <dim ; i ++)
i f ( a [ i ] <0)a [ i ]=−a [ i ] ;
f o r ( i =0; i <dim ; i ++)somma=somma+a [ i ] ;
r e t u r n somma;}vo id main ( ) {
. . .somma= sumabs ( array , DIM) ;p r i n t f ( " Stampa d i ar ray : \ n " ) ;f o r ( i =0; i <DIM ; i ++)
p r i n t f ( "%d " , a r ray [ i ] ) ; /∗Cosa stampa? ∗ /}
![Page 75: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/75.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Outline
1 PuntatoriVariabili puntatoreAritmetica dei puntatori
2 Puntatori e funzioniPassaggio per riferimento
3 Array Multidimensionali
![Page 76: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/76.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Array Multidimensionali
Sintassi:tipo-elementi nome-array [lung1].... [lungn];
mat[3][4]; matrice 3×4Per ogni dimensione i l’indice va da 0 a lungi -1.
colonne0 1 2 3
0 ? ? ? ?righe 1 ? ? ? ?
2 ? ? ? ?
Esempio int marketing[10][5][12](indici potrebbero rappresentare: prodotti, venditori, mesidell’anno)
![Page 77: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/77.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Accesso agli elementi di una matrice
colonne0 1 2 3
0righe 1
2
int i, mat[3][4];....i = mat[0][0]; elemento di riga 0 e colonna 0 (primo elemento)
mat[2][3] = 28; elemento di riga 2 e colonna 3 (ultimo elemento)
mat[2][1] = mat[0][0] * mat[1][3];
Come per i vettori, l’unica operazione possibile sulle matrici èl’accesso agli elementi tramite l’operatore [].
![Page 78: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/78.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Esempio: Lettura e stampa di una matrice
# inc lude < s t d i o . h># de f ine RIG 2# def ine COL 3main ( ) {
i n t mat [ RIG ] [ COL ] ;i n t i , j ;/∗ l e t t u r a matr ice ∗ /p r i n t f ( " Le t t u ra matr ice %d x %d ; \ n " , RIG , COL) ;f o r ( i = 0 ; i < RIG ; i ++)
f o r ( j = 0 ; j < COL; j ++)scanf ( "%d " , &mat [ i ] [ j ] ) ;
p r i n t f ( " La matr ice e ’ : \ n " ) ; } /∗ stampa matr ice ∗ /f o r ( i = 0 ; i < RIG ; i ++) {
f o r ( j = 0 ; j < COL; j ++)p r i n t f ( "%d " , mat [ i ] [ j ] ) ;
p r i n t f ( " \ n " ) ; /∗ a capo dopo ogni r i g a ∗ /}
}
![Page 79: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/79.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri I
Una funzione che opera su un vettore ha bisogno del puntatore(costante) all’elemento di indice 0.Non serve la dimensione del vettore nel parametro formale.
Una funzione che opera su una matrice ha invece bisognoanche del numero di colonne della matrice nel parametroformale.
void stampa(int mat[][5], int righe)
Per accedere all’ elemento, mat[i][j], la funzione devecalcolare l’indirizzo di tale elemento.
L’indirizzo di mat[i][j] è infatti:mat + (i · C · sizeof(int)) + (j · sizeof(int))dove C è il numero di colonne (gli elementi in ciascuna riga).
![Page 80: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/80.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri I
Una funzione che opera su un vettore ha bisogno del puntatore(costante) all’elemento di indice 0.Non serve la dimensione del vettore nel parametro formale.
Una funzione che opera su una matrice ha invece bisognoanche del numero di colonne della matrice nel parametroformale.
void stampa(int mat[][5], int righe)
Per accedere all’ elemento, mat[i][j], la funzione devecalcolare l’indirizzo di tale elemento.
L’indirizzo di mat[i][j] è infatti:mat + (i · C · sizeof(int)) + (j · sizeof(int))dove C è il numero di colonne (gli elementi in ciascuna riga).
![Page 81: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/81.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri I
Una funzione che opera su un vettore ha bisogno del puntatore(costante) all’elemento di indice 0.Non serve la dimensione del vettore nel parametro formale.
Una funzione che opera su una matrice ha invece bisognoanche del numero di colonne della matrice nel parametroformale.
void stampa(int mat[][5], int righe)
Per accedere all’ elemento, mat[i][j], la funzione devecalcolare l’indirizzo di tale elemento.
L’indirizzo di mat[i][j] è infatti:mat + (i · C · sizeof(int)) + (j · sizeof(int))dove C è il numero di colonne (gli elementi in ciascuna riga).
![Page 82: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/82.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri I
Una funzione che opera su un vettore ha bisogno del puntatore(costante) all’elemento di indice 0.Non serve la dimensione del vettore nel parametro formale.
Una funzione che opera su una matrice ha invece bisognoanche del numero di colonne della matrice nel parametroformale.
void stampa(int mat[][5], int righe)
Per accedere all’ elemento, mat[i][j], la funzione devecalcolare l’indirizzo di tale elemento.
L’indirizzo di mat[i][j] è infatti:mat + (i · C · sizeof(int)) + (j · sizeof(int))dove C è il numero di colonne (gli elementi in ciascuna riga).
![Page 83: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/83.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri II
Riassumendo:per calcolare l’indirizzo dell’elemento mat[i][j] è necessarioconoscere:
valore di mat, ovvero l’indirizzo del primo elemento dellamatrice
l’indice di riga i dell’elementol’indice di colonna j dell’elementoil numero C di colonne della matrice
In generale, in un parametro di tipo array vanno specificatetutte le dimensioni, tranne eventualmente la prima.
1. vettore: non serve specificare il numero di elementi2. matrice: bisogna specificare il numero di colonne, ma non
serve il numero di righe
![Page 84: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/84.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri II
Riassumendo:per calcolare l’indirizzo dell’elemento mat[i][j] è necessarioconoscere:
valore di mat, ovvero l’indirizzo del primo elemento dellamatricel’indice di riga i dell’elemento
l’indice di colonna j dell’elementoil numero C di colonne della matrice
In generale, in un parametro di tipo array vanno specificatetutte le dimensioni, tranne eventualmente la prima.
1. vettore: non serve specificare il numero di elementi2. matrice: bisogna specificare il numero di colonne, ma non
serve il numero di righe
![Page 85: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/85.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri II
Riassumendo:per calcolare l’indirizzo dell’elemento mat[i][j] è necessarioconoscere:
valore di mat, ovvero l’indirizzo del primo elemento dellamatricel’indice di riga i dell’elementol’indice di colonna j dell’elemento
il numero C di colonne della matriceIn generale, in un parametro di tipo array vanno specificatetutte le dimensioni, tranne eventualmente la prima.
1. vettore: non serve specificare il numero di elementi2. matrice: bisogna specificare il numero di colonne, ma non
serve il numero di righe
![Page 86: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/86.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri II
Riassumendo:per calcolare l’indirizzo dell’elemento mat[i][j] è necessarioconoscere:
valore di mat, ovvero l’indirizzo del primo elemento dellamatricel’indice di riga i dell’elementol’indice di colonna j dell’elementoil numero C di colonne della matrice
In generale, in un parametro di tipo array vanno specificatetutte le dimensioni, tranne eventualmente la prima.
1. vettore: non serve specificare il numero di elementi2. matrice: bisogna specificare il numero di colonne, ma non
serve il numero di righe
![Page 87: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/87.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri II
Riassumendo:per calcolare l’indirizzo dell’elemento mat[i][j] è necessarioconoscere:
valore di mat, ovvero l’indirizzo del primo elemento dellamatricel’indice di riga i dell’elementol’indice di colonna j dell’elementoil numero C di colonne della matrice
In generale, in un parametro di tipo array vanno specificatetutte le dimensioni, tranne eventualmente la prima.
1. vettore: non serve specificare il numero di elementi2. matrice: bisogna specificare il numero di colonne, ma non
serve il numero di righe
![Page 88: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/88.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri II
Riassumendo:per calcolare l’indirizzo dell’elemento mat[i][j] è necessarioconoscere:
valore di mat, ovvero l’indirizzo del primo elemento dellamatricel’indice di riga i dell’elementol’indice di colonna j dell’elementoil numero C di colonne della matrice
In generale, in un parametro di tipo array vanno specificatetutte le dimensioni, tranne eventualmente la prima.
1. vettore: non serve specificare il numero di elementi
2. matrice: bisogna specificare il numero di colonne, ma nonserve il numero di righe
![Page 89: Lezione 6 Laboratorio di Programmazione Ididawiki.di.unipi.it/.../informatica/prl/lect6-punt.pdfLezione 6 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020](https://reader033.vdocuments.mx/reader033/viewer/2022042916/5f56b075a8740b34a15d5ed2/html5/thumbnails/89.jpg)
PuntatoriPuntatori e funzioni
Array Multidimensionali
Passaggio di matrici come parametri II
Riassumendo:per calcolare l’indirizzo dell’elemento mat[i][j] è necessarioconoscere:
valore di mat, ovvero l’indirizzo del primo elemento dellamatricel’indice di riga i dell’elementol’indice di colonna j dell’elementoil numero C di colonne della matrice
In generale, in un parametro di tipo array vanno specificatetutte le dimensioni, tranne eventualmente la prima.
1. vettore: non serve specificare il numero di elementi2. matrice: bisogna specificare il numero di colonne, ma non
serve il numero di righe