• Non ci sono risultati.

IEIM 2018-2019

N/A
N/A
Protected

Academic year: 2021

Condividi "IEIM 2018-2019"

Copied!
24
0
0

Testo completo

(1)

IEIM 2018-2019

Esercitazione V

“Puntatori, Matrici, Funzioni”

Alessandro A. Nacci

[email protected] - www.alessandronacci.it

1

(2)

Puntatori e memoria

Esercizio 2

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

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.

(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

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.

(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

8

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

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

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.

(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

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.

(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

14

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

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.

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;

}

(17)

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

Singolo valore in uscita


(in C si può restituire un solo valore alla volta)

Nome

(18)

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

(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

}

(20)

20

MATRICI E FUNZIONI

Il passaggio di una matrice ad una funzione

e’ sempre per indirizzo e mai per copia.

(21)

Esercizio 1: Matrici e Funzioni

21

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

Calcolo ma nuale dello spiazzame nto

Puntatore a d intero!

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

INDIRIZZO

Valore contenuto all’indirizzo tra parentesi

(22)

Esercizio 1: Matrici e Funzioni

22

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

Esplicito che il puntatore punta al primo elemento

di una matrice RxC

Accesso comodo alla matrice!

(23)

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

Esercizio 1: Matrici e Funzioni

23

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

Esplicito che il puntatore punta al primo elemento di una matrice con C colonne

Accesso comodo alla matrice!

x x x

x x x Ai fini del calcolo dello

spiazzamento il numero di righe non è essenziale!

NOTA BENE

Il valore di mat cambia Il valore di mat cambia Il valore di mat cambia

(24)

24

Tutte il materiale sarà disponibile sul mio sito internet!

www.alessandronacci.it

Riferimenti

Documenti correlati

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

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

• dica quale dei due array ha valor medio più alto. • calcoli l'array concatenato tra i due array

Scrivere un programma che prenda stringhe di lunghezza massima 100 (quando l'utente inserisce la stringa &#34;stop&#34; il!. programma smette di

• Se l’elemento A[i] considerato è uguale al carattere occorrenza ed è uguale all’elemento A[i-1], incremento un contatore occorrenze (occorrenze++). • Se l’elemento A[i] non

Macchina a Stati Finiti (Coffee Machine).. typedef enum {