• Non ci sono risultati.

IEIM 2019-2020

N/A
N/A
Protected

Academic year: 2021

Condividi "IEIM 2019-2020"

Copied!
39
0
0

Testo completo

(1)

IEIM 2019-2020

Esercitazione V

“Puntatori”

Alessandro A. Nacci

alessandro.nacci@polimi.it - www.alessandronacci.it

1

(2)

Puntatori e memoria

Esercizio 2

(3)

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.

(4)

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.

(5)

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.

(6)

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.

(7)

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.

(8)

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.

(9)

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.

(10)

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.

(11)

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.

(12)

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.

(13)

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.

(14)

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.

(15)

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.

(16)

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

(17)

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;

}

(18)

Le funzioni

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

int q;

// codice vario

// che effettua calcoli

return q;

(19)

Le funzioni

17

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

int q;

// codice vario

// che effettua calcoli

return q;

}

Nome

(20)

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

(21)

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

(22)

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

(23)

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

(24)

Le funzioni con gli array

(25)

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

}

(26)

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;

(27)

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

(28)

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

(29)

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

(30)

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

7

7

3

(31)

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

(32)

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

7

3

Al termine 3

dell’esecuzione di

swap le variabili nel

(33)

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

(34)

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

(35)

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

(36)

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 3

p q

temp

3

(37)

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 Al termine 3

dell’esecuzione di swap le variabili nel main vengono

modificate

(38)

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

(39)

33

Tutte il materiale sarà disponibile sul mio sito internet!

www.alessandronacci.it

Riferimenti

Documenti correlati

Dati cinque voti compresi tra 0 e 10, calcolarne la media e dire se lo studente e' bocciato (media minore di 6)!. o promosso (media maggiore o uguale

• dica in quale dei due array sono presenti i due valori di massimo e minimo. • calcoli l'array riversato In questa so luzione, non usare l

Scrivere un programma che prenda stringhe di lunghezza massima 100 (quando l'utente inserisce la stringa "stop" il. programma smette di

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

• Il programma deve poter permettere la creazione di auto e la stampa a schermo di tutti i dati relativi ad un’auto.. • Deve poter permettere inoltre di modificare il

* Un programma per la rappresentaizone tramite metodo BITMAP di forme su un piano cartesiano. * Il programmad deve poter rappresentare e visualizzare a schermo forme quali

Marco e' padre di LUCA e di PIPPO Stefania e' madre di LUCA e di PIPPO Arianna e' figlia di Marco e Lucia. Stefano e' figlio di Arianna

• Il programma deve avere una funziona che crea una immagine completamente bianca6. • Il programma deve avere una funziona che crea una immagine