es5 - DEIB - Politecnico di Milano · DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esempio: scambio...

Post on 25-Aug-2020

2 views 0 download

transcript

IEIM 2019-2020

Esercitazione V“Puntatori”

Alessandro A. Naccialessandro.nacci@polimi.it - www.alessandronacci.it

1

Puntatori e memoriaEsercizio 2

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

4

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?

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

6

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;

}

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

Esercizio 2: Puntatori e memoria

7

30

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

8

30

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~

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

Esercizio 2: Puntatori e memoria

9

30

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

b0

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

Esercizio 2: Puntatori e memoria

10

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

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

12

3

3~13~~~

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

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

14

3

3~13~~53

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

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~~53~

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.

16

q = f(x,y,z)

xyz

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)

xyz

q

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;

}

Le funzioni

17

int foo(int x, int y, int z){

int q;

// codice vario // che effettua calcoli

return q;

}

Nome

Le funzioni

17

int foo(int x, int y, int z){

int q;

// codice vario // che effettua calcoli

return q;

}

Parametri in ingressocon tipo

Nome

Le funzioni

17

int foo(int x, int y, int z){

int q;

// codice vario // che effettua calcoli

return q;

}

Parametri in ingressocon tipoTipo dato

in uscita(void se non

Nome

Le funzioni

17

int foo(int x, int y, int z){

int q;

// codice vario // che effettua calcoli

return q;

}

Parametri in ingressocon tipoTipo dato

in uscita(void se non

Singolo valore in uscita (in C si può restituire un solo valore

alla volta)

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

19

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

20

int somma_speciale(int d, int c){

int q = 3;return d + c + q;

}

int main(){

int a;int b;int c;

a = 2;b = 5;

c = somma_speciale(a,b);}

Vediamo cosa succede in memoria

21

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio valori

• Si scriva una funzione in C che, datidue valori interi, gli restituiscescambiati

20

Un esempio: funzione swap

22

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)

21

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

24

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)

23

a

b

3

7

p

q

temp

7

7

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

7

3

3

Un esempio: funzione swap

26

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)

25

a

b

3

7

p

q

temp

7

3

3Al termine dell’esecuzione di swap le variabili nel main restano inalterate!

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

28

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)

27

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

7

7

p

q

temp

3

Un esempio: funzione swap

30

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)

29

a

b

7

3

p

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

3

p

q

temp

3Al termine dell’esecuzione di swap le variabili nel main vengono modificate

32

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

31

33

Tutte il materiale sarà disponibile sul mio sito internet!

www.alessandronacci.it