IEIM 2019-2020
Esercitazione V
“Puntatori”
Alessandro A. Nacci
alessandro.nacci@polimi.it - www.alessandronacci.it
1
Puntatori e memoria
Esercizio 2
Esercizio 2: Puntatori e memoria
3
0 1 2 3 4 5 6 7 8 9
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
int d = *b;
int e;
}
DATO UN PROGRAMMA C, COME SI COMPORTA LA MEMORIA?
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
0 1 2 3 4 5 6 7
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
ATTENZIONE!
Il comportamento della memoria mostrato in questo esercizio non è del tutto coerente con quanto avviene su un reale
calcolatore. L’esempio mostrato è però funzionale alla spiegazione del comportamento dei puntatori in C.
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
5
0 1 2 3 4 5 6 7 8 9
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
int d = *b;
int e;
}
DATO UN PROGRAMMA C, COME SI COMPORTA LA MEMORIA?
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
0 1 2 3 4 5 6 7
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
7
3
0 1 2 3 4 5 6 7 8 9
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
int d = *b;
int e;
} a
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
3
0 1 2 3 4 5 6 7
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
a
~ b
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
9
3
0 1 2 3 4 5 6 7 8 9
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
int d = *b;
int e;
} a
0 b
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
3 3
~
~
~
~
0 1 2 3 4 5 6 7
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
a b mat mat mat mat mat
0
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
11
3 3
~
~
~
~
~
0 1 2 3 4 5 6 7 8 9
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
int d = *b;
int e;
} a
b mat mat mat mat mat
c
0
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
3 3
~ 13
~
~
~
0 1 2 3 4 5 6 7
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
a b mat mat mat mat mat
c
0
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
13
3 3
~ 13
~
~ 5
0 1 2 3 4 5 6 7 8 9
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
int d = *b;
int e;
} a
b mat mat mat mat mat
c
0
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
3 3
~ 13
~
~ 5
0 1 2 3 4 5 6 7
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
a b mat mat mat mat mat
c
0
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Esercizio 2: Puntatori e memoria
15
3 3
~ 13
~
~ 5 3
~
0 1 2 3 4 5 6 7 8 9
IND. CONTENUTO
int main() {
int a = 3;
printf(“%d”, &a);
int* b;
b = &a;
int mat[2][2];
int* c;
mat[0][1] = 13;
c = &(mat[1][0]);
int d = *b;
int e;
} a
b mat mat mat mat mat
c d e
0
Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.
Le funzioni
• Le funzioni sono “blocchi” di codice che prendono in ingresso dei valori tramite i parametri e restituiscono, dopo della
computazione, un risultato.
q = f(x,y,z)
x y
z q
Le funzioni
• Le funzioni sono “blocchi” di codice che prendono in ingresso dei valori tramite i parametri e restituiscono, dopo della
computazione, un risultato.
16
q = f(x,y,z)
x y
z q
int foo(int x, int y, int z) {
int q;
// codice vario
// che effettua calcoli
return q;
}
Le funzioni
int foo(int x, int y, int z) {
int q;
// codice vario
// che effettua calcoli
return q;
Le funzioni
17
int foo(int x, int y, int z) {
int q;
// codice vario
// che effettua calcoli
return q;
}
Nome
Le funzioni
int foo(int x, int y, int z) {
int q;
// codice vario
// che effettua calcoli
return q;
Parametri in ingresso con tipo
Nome
Le funzioni
17
int foo(int x, int y, int z) {
int q;
// codice vario
// che effettua calcoli
return q;
}
Parametri in ingresso con tipo
Tipo dato in uscita (void se non
Nome
Le funzioni
int foo(int x, int y, int z) {
int q;
// codice vario
// che effettua calcoli
return q;
Parametri in ingresso con tipo
Tipo dato in uscita (void se non
Nome
Le funzioni con gli array
• Per alcuni motivazioni tecniche del C, con gli array ci sono alcuni “problemini”
• Semplificando, In C non è possibile fare return di un array
• In C, quando si passa in ingresso un array come parametro, le
modifiche fatte su quel parametro agiscono direttamente sull’array
originale passato dal chiamante.
18
Le funzioni con gli array
Le funzioni con gli array
19
void foo(int x_arr[]) {
x_arr[3] = 13;
return;
}
int main() {
int x_arr[10];
x_arr[3]= 2;
printf(“%d”,x_arr[3]); // Stampa 2 foo(x_arr);
printf(“%d”,x_arr[3]); // Stampa 13
}
Vediamo cosa succede in memoria
int somma_speciale(int d, int c) {
int q = 3;
return d + c + q;
}
int main() {
int a;
int b;
int c;
a = 2;
Vediamo cosa succede in memoria
21
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio valori
• Si scriva una funzione in C che, dati
due valori interi, gli restituisce
scambiati
20
Un esempio: funzione swap
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio di 2 valori interi
void swap (int p, int q) { int temp;
temp = p;
p = q;
q = temp;
}
• Nel main: swap(a,b)
a b
3 7
p q
temp 3
7
Un esempio: funzione swap
23
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio di 2 valori interi
void swap (int p, int q) { int temp;
temp = p;
p = q;
q = temp;
}
• Nel main: swap(a,b)
22
a b
3 7
p q
temp 3
7
3
Un esempio: funzione swap
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio di 2 valori interi
void swap (int p, int q) { int temp;
temp = p;
p = q;
q = temp;
}
• Nel main: swap(a,b)
a b
3 7
p q
temp
77
3
Un esempio: funzione swap
25
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio di 2 valori interi
void swap (int p, int q) { int temp;
temp = p;
p = q;
q = temp;
}
• Nel main: swap(a,b)
24
a b
3 7
p q
temp
73
3
Un esempio: funzione swap
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio di 2 valori interi
void swap (int p, int q) { int temp;
temp = p;
p = q;
q = temp;
}
• Nel main: swap(a,b)
a b
3 7
p q
temp
73
Al termine 3
dell’esecuzione di
swap le variabili nel
Un esempio: funzione swap
27
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio di 2 valori interi
void swap (int *p, int *q){
int temp;
temp = *p;
*p = *q;
*q = temp;
}
• Nel main: swap(&a, &b)
26
a b 3 7
p q
temp
Un esempio: funzione swap
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio di 2 valori interi
void swap (int *p, int *q){
int temp;
temp = *p;
*p = *q;
*q = temp;
}
• Nel main: swap(&a, &b)
a b 3 7
p q
temp
3
Un esempio: funzione swap
29
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio di 2 valori interi
void swap (int *p, int *q){
int temp;
temp = *p;
*p = *q;
*q = temp;
}
• Nel main: swap(&a, &b)
28
a b
77
p q
temp
3
Un esempio: funzione swap
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio di 2 valori interi
void swap (int *p, int *q){
int temp;
temp = *p;
*p = *q;
*q = temp;
}
• Nel main: swap(&a, &b)
a b
7 3p q
temp
3
Un esempio: funzione swap
31
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: scambio di 2 valori interi
void swap (int *p, int *q){
int temp;
temp = *p;
*p = *q;
*q = temp;
}
• Nel main: swap(&a, &b)
30
a b
7 3p q
temp Al termine 3
dell’esecuzione di swap le variabili nel main vengono
modificate
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Fonti per lo studio + Credits
• Fonti per lo studio
§ Binky Pointer Fun Video:
http://cslibrary.stanford.edu/104/
• Credits
§ Gianluca Palermo
33