43
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Passaggio parametri puntatore Parte 6 Domenico Daniele Bloisi

Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Corso di Fondamenti di InformaticaIngegneria delle Comunicazioni BCORIngegneria Elettronica BELR

Passaggio parametri puntatore

Parte 6

Domenico Daniele Bloisi

Page 2: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Docenti

Parte I – prof. Silvio Salza

[email protected]@dis.uniroma1.it

http://www.dis.uniroma1.it/~salza/fondamenti.htm

Parte II – ing. Domenico Daniele Bloisi

[email protected]

2010/2011Passaggio parametri puntatoreParte 6

Pagina 2

http://www.dis.uniroma1.it/~bloisi/didattica/fondin f1011.html

Nota: %7E corrisponde alla tilde ~

Page 3: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Informazioni Generali

ing. Domenico Daniele Bloisi, PhD

Dipartimento di Informatica e SistemisticaDipartimento di Informatica e SistemisticaVia Ariosto 25(adiacente Piazza Dante,

A fermate Manzoni, Vittorio Emanuele,Tram 3 fermata via Labicana)

mailto:[email protected]

Pagina 3

mailto:[email protected]

http://www.dis.uniroma1.it/~bloisi

2010/2011Passaggio parametri puntatoreParte 6

Page 4: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Ricevimento

Martedì 15.00 – 17.00DIS, via Ariosto 25DIS, via Ariosto 25

Aula docenti adiacente aula A4

Si consiglia di inviare una email per conferma edi controllare la bacheca degli avvisi

Pagina 4

http://www.dis.uniroma1.it/~bloisi/didattica/fondin f1011.html#Avvisi

2010/2011Passaggio parametri puntatoreParte 6

Page 5: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Sommario – Parte 6

• Memoria, indirizzamento e puntatori• Tipo void * e conversioni sui puntatori• Gestione dinamica della memoria• Gestione dinamica della memoria• Tempo di vita delle variabili allocate dinamicamente

• Problemi di deallocazione della memoria• Passaggio dei parametri tramite puntatori

Pagina 52010/2011Passaggio parametri puntatoreParte 6

Page 6: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Tempo di vita delle variabili allocate dinamicamente (1/2)

Per le variabili allocate dinamicamente il tempo di vita corrisponde al periodo che va

� dal momento in cui la variabile viene allocata

� al momento in cui la variabile viene deallocata.

Il tempo di vita di una variabile allocata dinamicamente è definito solo al momento

Pagina 62010/2011Passaggio parametri puntatoreParte 6

dinamicamente è definito solo al momento dell'esecuzione del programma.

Page 7: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Tempo di vita delle variabili allocate dinamicamente (2/2)Se una variabile allocata dinamicamente non viene deallocata esplicitamente, il suo tempo di vita termina alla terminazione del programma.vita termina alla terminazione del programma.

Può verificarsi il caso in cui una zona di memoria allocata non sia più accessibile, in quanto non ci sono variabili che la “riferiscono”.Tale zona di memoria rimarrà inutilmente

Pagina 72010/2011Passaggio parametri puntatoreParte 6

Tale zona di memoria rimarrà inutilmente occupata per tutta la durata del programma.

Page 8: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esempio: tempo di vita variabili dinamicheint * creaint (int a) {

int * temp = malloc(sizeof(int));*temp = a;*temp = a;return temp;

}

int main () {int * pt2 = creaint(5);

Pagina 82010/2011Passaggio parametri puntatoreParte 6

int * pt2 = creaint(5);printf("*pt2 = %d \n", *pt2);

}

Page 9: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esecuzione: Tempo di vita variabili dinamiche

Il programma precedente stampa

*pt2 = 5*pt2 = 5

poiché la variabile allocata dalla funzione creaint viene restituita al programma principale e rimane accessibile anche al termine della esecuzione della funzione .

Pagina 92010/2011Passaggio parametri puntatoreParte 6

Le variabili create dinamicamente non rispettano le regole di campo di azione.

Page 10: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esempio: esaurimento della memoria

// sciupaMemoria ;int *temp , k;for (k = 1; 1 ; k++) {for (k = 1; 1 ; k++) {

printf ("k = %d \n", k);temp = malloc (sizeof (int ));

}

L'esecuzione comporta una richiesta infinita di

Pagina 102010/2011Passaggio parametri puntatoreParte 6

L'esecuzione comporta una richiesta infinita dimemoria (la condizione del ciclo è sempre verificata).

Page 11: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esecuzione: esaurimento della memoriaL’esecuzione produrrà una richiesta infinita di memo ria che in C comporta (dopo un numero di cicli piuttost o alto) l’interruzione dell’esecuzione con un messaggio simil e al l’interruzione dell’esecuzione con un messaggio simil e al seguente:

dynamic(1320) malloc: *** mmap(size=16777216) faile d (error code=12) *** error: can’t allocate region

Pagina 112010/2011Passaggio parametri puntatoreParte 6

Nota: Ad ogni ripetizione del ciclo, la memoria allo cata al ciclo precedente risulta inaccessibile.

Page 12: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Problemi di deallocazione della memoriaint *pt1;pt1 = malloc(sizeof(int)); // allocazione della variabile*pt1 = 1;*pt1 = 1;printf("*pt1 = %d\n", *pt1); // uso della variabilefree(pt1);// la locazione di memoria rimane accessibile dopo f ree!!!printf("after free\n");printf("*pt1 = %d\n", *pt1);// la stessa locazione di memoria potrebbe essere ri -allocata!!!int *pt2 = malloc(sizeof(int));printf (" after malloc \ n");

Pagina 122010/2011Passaggio parametri puntatoreParte 6

printf (" after malloc \ n");printf("*pt2 = %d\n", *pt2);

Page 13: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esecuzione

Pagina 132010/2011Passaggio parametri puntatoreParte 6

Page 14: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Discussione: problemi di deallocazione della memoriaIn questo caso, si può verificare che la memoria ri manga accessibile anche dopo il rilascio, ed addirittura che sia ancora immutata (anche se non è garantito).ancora immutata (anche se non è garantito).

In aggiunta, la riallocazione immediata potrebbe riallocare la variabile nella stessa posizione della memoria e quindi con lo stesso valore (ma anche que sto non è garantito).

Pagina 142010/2011Passaggio parametri puntatoreParte 6

In ogni caso, entrambe le situazioni sopra delineate sono da evitare accuratamente, in quanto fonti di errori e di comportamenti instabili del programma.

Page 15: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Puntatori appesi

Si consideri il seguente frammento di codice

int *pt1;pt1 = malloc(sizeof(int)); *pt1 = 1;printf("*pt1 = %d\n", *pt1);int *pt2;pt2 = pt1;printf("prima di free(pt1)\n");printf ("*pt2 = %d \ n", *pt2);

Pagina 152010/2011Passaggio parametri puntatoreParte 6

printf ("*pt2 = %d \ n", *pt2);free(pt1);printf("dopo di free(pt1)\n");printf("*pt2 = %d\n", *pt2);

Page 16: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esecuzione: Puntatori appesi

*pt1 = 1prima di free(pt1)*pt2 = 1*pt2 = 1dopo di free(pt1)*pt2 = 4001536

In questo caso, il rilascio della memoria puntata d alla variabile pt1 lascia la variabile pt2 puntare ad una locazione di memoria rilasciata e quindi suscettibil e di modifiche arbitrarie da parte del sistema operativo .

Questa situazione di puntatore appeso (dangling) è d a evitare assolutamente in quanto fonte di errori dif ficili da individuare.

Pagina 162010/2011Passaggio parametri puntatoreParte 6

modifiche arbitrarie da parte del sistema operativo .

Page 17: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Passaggio di parametri (1/2)

L’uso di variabili di tipo puntatore consente di simulare la modalità di passaggio dei parametri per riferimento.per riferimento.

Nel passaggio di parametri per valore, in genere utilizzato per i dati di tipo primitivo, il paramet ro formale può essere considerato come una variabile locale che viene inizializzata al momento

Pagina 172010/2011

variabile locale che viene inizializzata al momento della chiamata della funzione con il valore corrispondente al parametro attuale.

Passaggio parametri puntatoreParte 6

Page 18: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Passaggio di parametri (2/2)

Il passaggio di parametro per valore effettuato con il tipo puntatore consente di aggirare una proprietà cruciale del passaggio di parametri proprietà cruciale del passaggio di parametri per valore, cioè la garanzia che la funzione non abbia effetti sul programma chiamante (ad eccezione della restituzione del valore calcolato).

Pagina 182010/2011Passaggio parametri puntatoreParte 6

Page 19: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esempio: passaggio parametripuntatore

void swap(int *a, int *b) {void swap(int *a, int *b) {int temp;temp = *a;*a = *b;*b = temp;

}

Pagina 192010/2011Passaggio parametri puntatoreParte 6

Page 20: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esempio: passaggio parametripuntatoreint main (){

int x, y;x = 12; y = 27;x = 12; y = 27;printf("x = %d \n", x);printf("y = %d \n", y);swap(&x, &y);printf("after swap \n");printf("x = %d \ n", x);

Pagina 202010/2011

printf("x = %d \ n", x);printf("y = %d \n", y);

}

Passaggio parametri puntatoreParte 6

Page 21: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esecuzione

x = 12y = 27y = 27after swapx = 27y = 12

Pagina 212010/2011Passaggio parametri puntatoreParte 6

Page 22: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Passaggio parametri puntatore

Nonostante il passaggio di parametri sia per valore , il risultato dell’esecuzione della funzione swap consiste proprio nel modificare il valore di due variabili d el proprio nel modificare il valore di due variabili d el programma principale.

Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili punt ate, anche se il valore delle variabili puntatore rimane inalterato .

Pagina 222010/2011

inalterato .

L’uso dei puntatori nel passaggio di parametri per valore consente di effettuare in pratica il passaggio di p arametri per riferimento.

Passaggio parametri puntatoreParte 6

Page 23: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Passaggio per valore VS passaggio tramite puntatori

void swap(int *a, int *b) {int temp;temp = *a;*a = *b;

swap(&x, &y);

definizione invocazione*a = *b;*b = temp;

}

void swapVal(int a, int b) {int temp;temp = a;a = b;

swapVal(x, y);

definizione invocazione

definizione invocazione

Pagina 232010/2011

a = b;b = temp;

}

Cosa succede se si invoca swapVal(&x, &y); ?

Passaggio parametri puntatoreParte 6

Page 24: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esecuzione

Pagina 242010/2011Passaggio parametri puntatoreParte 6

Page 25: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Chiamata tramite parametri puntatore (per indirizzo): funzione chiamanteQuando la funzione viene chiamata, devono essere passati come parametri gli indirizzi delle variabili

• il passaggio degli indirizzi potrà essere ottenuto • il passaggio degli indirizzi potrà essere ottenuto applicando l’operatore di indirizzo & alla variabile che deve essere modificata

• sono passate le “celle” fisiche dove i valori sono memorizzati

int a; int b;2a&a

Pagina 252010/2011Passaggio parametri puntatoreParte 6

int a; int b;a = 2; b = 3;f(&a, &b);

2

3

a

b

&b

Page 26: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Chiamata per indirizzo

Nell’intestazione della funzione chiamata deve essere usato l’operatore di deriferimento per le variabili passate per indirizzoper indirizzo

void f(int *pa, int *pb){

*pa = 6;*pb = 7;

&apa

&pa

&pb

Pagina 262010/2011Passaggio parametri puntatoreParte 6

*pb = 7;}&bpb

Page 27: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Chiamata per indirizzo: esecuzione

int a; int b;a = 2; b = 3;f(&a, &b);6a

&a

f(&a, &b);

void f(int *pa, int *pb){

pa

&pa

&pb

6

7

a

b

&b

int *pa = &a;

Pagina 272010/2011Passaggio parametri puntatoreParte 6

{*pa = 6;*pb = 7;

}

pb

&pb

Page 28: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Vantaggi del passaggio per riferimento

Il passaggio di parametri di tipo puntatore è particolarmente utile quando i dati che devono essere scambiati tra funzione chiamata e essere scambiati tra funzione chiamata e programma chiamante sono voluminosi.

Il passaggio per riferimento risulta molto più efficiente sia in termini di occupazione di memoria che di tempo di calcolo (infatti,

Pagina 282010/2011

memoria che di tempo di calcolo (infatti, occorre la copia del solo puntatore ai dati, non di tutto l’insieme dei dati).

Passaggio parametri puntatoreParte 6

Page 29: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Valori restituiti di tipo puntatoredouble *puntatore (double a) {

double *r = malloc(sizeof(double));*r = a;*r = a;return r;

}

int main () {double *pd = puntatore(5.4);printf("pd = %p\n", pd);printf("*pd = %f \ n", *pd);

Pagina 292010/2011

printf("*pd = %f \ n", *pd);return 0;

} la funzione puntatore crea un puntatore ad una variabile di tipo double e la inizializza con il valore passato come argomento

Passaggio parametri puntatoreParte 6

Page 30: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esercizi

Esercizio 6.5

Scrivere un programma che legga tre valori in tre distinte variabili small , medium, large , e ne scambi i distinte variabili small , medium, large , e ne scambi i valori in modo da avere il più grande nella variabi le large , il più piccolo nella variabile small ed il restante nella variabile medium. Definire una funzione per lo scambio dei tre valori che utilizzi il passaggio di parametri puntatore.

Pagina 302010/2011Passaggio parametri puntatoreParte 6

Page 31: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Esercizi

Esercizio 6.6

Scrivere una funzione che dati due valori interi a e brestituisca quoziente e resto della divisione a/b . restituisca quoziente e resto della divisione a/b . Scrivere un programma di prova per tale funzione,leggendo l’input da tastiera.

Pagina 312010/2011Passaggio parametri puntatoreParte 6

Page 32: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Appendice: memoria

0

Memoria

La memoria del calcolatore può essere idealmente descritta come un insieme di celle ORDINATOUNIVOCAMENTE

Pagina 322010/2011Passaggio parametri puntatoreParte 6

n

Page 33: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Appendice: assegnazione

int x = 1;0

12359156L’istruzione di assegnazione permette di “scrivere” un valore all’interno di una cella simboleggiata da un nome di variabile

x

Pagina 332010/2011Passaggio parametri puntatoreParte 6

nvariabile

Page 34: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Appendice: valore di una variabile

int x = 1;printf("x = %d\n", x);

0

Produce

x = 112359156

Tramite il nome di una variabile è possibile “leggere” il contenuto

x

Pagina 342010/2011Passaggio parametri puntatoreParte 6

npossibile “leggere” il contenuto della cella simboleggiata da quella variabile

Page 35: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Appendice: indirizzo di una variabile

int x = 1;printf("&x = %d\n", &x);

0

Produce

&x = 235915612359156

Tramite l’operatore & applicato al nome di una variabile è possibile

x

Pagina 352010/2011Passaggio parametri puntatoreParte 6

nnome di una variabile è possibile “leggere” l’indirizzo della cella simboleggiata da quella variabile

Page 36: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Appendice: puntatore

int x = 1;int *x_ptr;

2359154 2359156 x_ptrint *x_ptr;x_ptr = &x;

printf("*x_ptr = %d\n", *x_ptr);printf("&x_ptr = %d\n", &x_ptr);printf("x_ptr = %d\n", x_ptr);

Produce

12359156

2359154 2359156

x

x_ptr

Pagina 362010/2011Passaggio parametri puntatoreParte 6

*x_ptr = 1&x_ptr = 2359154x_ptr = 2359156n

Page 37: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Appendice: valore tramite un puntatore

2359154 2359156 x_ptr

12359156

2359154 2359156

x

x_ptr

Tramite l’operatore * applicato al nome di un puntatore è possibile “leggere” il contenuto della cella il cui indirizzo è contenuto nella cella simboleggiata da quel

Pagina 372010/2011Passaggio parametri puntatoreParte 6

n

cella simboleggiata da quel puntatore

Page 38: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Soluzioni

Esercizio 6.2

Scrivere un programma che legga 10 numeri interi e restituisca il minimo, usando variabili di tipo pun tatore restituisca il minimo, usando variabili di tipo pun tatore ad int anziché variabili di tipo int .

Pagina 382010/2011Passaggio parametri puntatoreParte 6

Page 39: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Soluzioni#include <stdio.h>#include <stdlib.h>

int main() {int i, v, min;int i, v, min;int *min_ptr, *v_ptr;min_ptr = &min;v_ptr = &v;printf("inserisci 10 interi:\n");scanf("%d", v_ptr);//printf("ho letto %d\n", *v_ptr);*min_ptr = *v_ptr;for(i = 1; i < 10; i++) {

scanf("%d", v_ptr);//printf("ho letto %d \ n", *v_ptr);

Pagina 392010/2011Passaggio parametri puntatoreParte 6

//printf("ho letto %d \ n", *v_ptr);if(*v_ptr < *min_ptr)

*min_ptr = *v_ptr;}printf("minimo = %d\n", *min_ptr);return 0;

}

Page 40: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Soluzioni

Esercizio 6.3

Scrivere il programma dell’esercizio precedente tramite allocazione dinamica della memoria. Dealloca re tramite allocazione dinamica della memoria. Dealloca re la memoria utilizzata prima della terminazione del programma.

Pagina 402010/2011Passaggio parametri puntatoreParte 6

Page 41: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Soluzioni#include <stdio.h>#include <stdlib.h>

int main() {int i, *min, *v;int i, *min, *v;min = malloc(sizeof(int));v = malloc(sizeof(int));printf("inserisci 10 interi:\n");scanf("%d", v);//printf("ho letto %d\n", *v);*min = *v;for(i = 1; i < 10; i++) {

scanf("%d", v);//printf("ho letto %d\n", *v);if(*v < *min)

Pagina 412010/2011Passaggio parametri puntatoreParte 6

if(*v < *min)*min = *v;

}printf("minimo = %d\n", *min);free(v); free(min);return 0;

}

Page 42: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Soluzioni

Esercizio 6.4

Scrivere una funzione che dato in ingresso un puntatore ne stampi la dimensione in byte, il valor e, puntatore ne stampi la dimensione in byte, il valor e, l’indirizzo di memoria ed il valore della variabile puntata. Scrivere un programma che ne verifichi il comportamento.

Pagina 422010/2011Passaggio parametri puntatoreParte 6

Page 43: Passaggio parametri puntatore - Dipartimento di Ingegneria ...bloisi/didattica/... · Passando alla funzione i puntatori a due variabili è possibile modificare il valore delle variabili

Soluzionivoid infoPtr_int(int **ptr) {

printf("dimensione del puntatore: %d\n", sizeof(*ptr));

printf("valore del puntatore: %p \ n", *ptr);printf("valore del puntatore: %p \ n", *ptr);printf("indirizzo del puntatore: %p\n", &(*ptr));printf("dimensione della variabile puntata: "

"%d\n", sizeof(**ptr));printf("valore della variabile puntata: %d\n\n",

**ptr);}int main() {

Si provi a scrivere una funzionevoid

Pagina 432010/2011Passaggio parametri puntatoreParte 6

int main() {int i = 5, *ptr_i;ptr_i = &i;infoPtr_int(&ptr_i);

}

voidinfoPtr_double(double **ptr)