• Non ci sono risultati.

Fondamenti di Informatica

N/A
N/A
Protected

Academic year: 2021

Condividi "Fondamenti di Informatica"

Copied!
3
0
0

Testo completo

(1)

Fondamenti di Informatica

© 2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2)

1

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 1

FONDAMENTI DI INFORMATICA

Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI

Facoltà di Ingegneria Università degli Studi di Udine

Linguaggio C I puntatori

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio, musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine.

Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero dell’Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di lucro. In tal caso non è richiesta alcuna autorizzazione.

Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori.

L’informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di queste slide (ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità, aggiornamento dell’informazione).

In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste slide.

In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali.

Nota di Copyright

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 3

I puntatori in C:

un concetto molto generale

• Un puntatore è una variabile che contiene l’indirizzo di un’altra variabile.

p = &x; L’operatore & fornisce l’indirizzo di un oggetto

y = *p; L’operatore * accede all’oggetto puntato

int *p; La variabile p è dichiarata puntatore ad intero

05FD

07C2

puntatore p

variabile intera x FFFF 07C2

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 4

double *dp;

char *ch;

*ip = *ip + 10;

++*ip;

(*ip)++;

*ip++;

Cosa significa?

→ dp è un puntatore a double

ch è un puntatore a char

incrementa di 10 il dato puntato da ip

!!! incrementa di 1 il puntatore ip

incrementano di 1 il dato puntato da ip

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 5

Esempio

int x = 5;

int *ip;

ip = &x; /* adesso *ip vale 5 */

*ip = 0; /* adesso *ip vale 0, e anche x */

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 6

#include <stdio.h>

#include <stdlib.h>

int main() {

int x;

int *ip;

x = 5;

printf ("x = %d, &x = %x, ip = %x (casuale)\n", x, &x, ip);

ip = &x; /* adesso *ip vale 5 */

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

*ip = 0; /* adesso *ip vale 0, e anche x */

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

return EXIT_SUCCESS;

}

Esempio

(2)

Fondamenti di Informatica

© 2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2)

2

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 7

Puntatori e argomenti di funzione

• Il C passa alle funzioni gli argomenti per valore (by value)

• La funzione chiamata non può modificare direttamente una variabile nella funzione chiamante (lavora sulle copie delle variabili)

• Dichiarare gli argomenti di una funzione come puntatori permette alla funzione chiamata di accedere agli oggetti all’interno della funzione chiamante (passaggio di variabili by reference)

Chiamante

Chiamata px

b

py a ...

...

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 8

Puntatori e argomenti di funzioni

• SWAP: scambia i valori dei due argomenti

swap (a, b); /* nel main */

...

void swap (int x, int y) {

int temp;

temp = x;

x = y;

y = temp;

} NON FUNZIONA!

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 9

Puntatori e argomenti di funzioni

• SWAP: scambia i valori dei due argomenti

swap (&a, &b); /* nel main */

...

void swap (int *xp, int *yp) {

int temp;

temp = *xp;

*xp = *yp;

*yp = temp;

} FUNZIONA!

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 10

Aritmetica dei puntatori

Operazioni possibili sui puntatori:

• incremento (il puntatore viene incrementato del numero di byte occupati dal tipo dell'oggetto puntato)

• somma con un intero (generalizzazione del caso precedente)

• confronto (se i due puntatori puntano a elementi dello stesso vettore)

• sottrazione (come sopra)

• assegnamento tra puntatori dello stesso tipo

• assegnamento e confronto con lo zero

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 11

Puntatori a funzioni

In C è possibile settare una variabile puntatore come puntatore ad una funzione. Tale funzione può essere chiamata non citandone esplicitamente il nome, ma usando la variabile puntatore.

Maggior versatilità e riutilizzabilità del codice

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 12

Dichiarazione dei puntatori a funzioni

Un puntatore a funzione va dichiarato nel seguente modo:

tipo (*nome_ptr) (tipo_arg_1, tipo_arg_2, tipo_arg_3, ...);

dove:

• nome_ptr è il nome del puntatore

• tipo è il tipo ritornato dalla funzione puntata

• tipo_arg_1, tipo_arg_2, … sono i tipi degli

argomenti della funzione puntata

(3)

Fondamenti di Informatica

© 2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2)

3

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 13

Inizializzazione dei puntatori a funzioni

Un puntatore a funzione va inizializzato ad un valore nel seguente modo:

nome_ptr = nome_funz;

dove:

• nome_ptr è il nome del puntatore a funzione

• nome_funz è il nome della funzione puntata

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 14

Chiamata a puntatori a funzioni

• Un puntatore a funzione può essere invocato all’interno di un programma con la sintassi:

(*nome_ptr) (arg_1, arg_2, arg_3, ...);

dove arg_1, arg_2, arg_3, … sono gli argomenti da passare alla funzione puntata.

• NOTA: nome_ptr è il puntatore; *nome_ptr indica la funzione puntata da nome_ptr !

Fondamenti di Informatica - Linguaggio C - I puntatori

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 15

Un semplice esempio

#include <stdio.h>

void a (int x);

void b (int x);

int main() {

void (*fp)();

fp = a;

(*fp)(3);

fp = b;

(*fp)(3);

}

void a (int x) {

printf

("%d\n", x + x);

}

void b (int x) {

printf

("%d\n", x * x);

}

Riferimenti

Documenti correlati

© 2001 Pier Luca Montessoro, Davide Pierattoni 1 (si veda la nota di copyright alla slide n. PIER LUCA MONTESSORO Ing. 2) 2 Questo insieme di trasparenze (detto nel seguito slide)

© 2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n.. PIER LUCA

© 2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n.. PIER LUCA

© 2001 Pier Luca Montessoro, Davide Pierattoni 1 (si veda la nota di copyright alla slide n.. PIER LUCA

© 2001 Pier Luca Montessoro, Davide Pierattoni 1 (si veda la nota di copyright alla slide n.. PIER LUCA

© 2001 Pier Luca Montessoro, Davide Pierattoni 1 (si veda la nota di copyright alla slide n.. PIER LUCA

© 1999 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2) 2 Le tecnologie alla base del World Wide Web (I parte). © 1999 Pier Luca Montessoro ( si veda la nota a

© 2001 Pier Luca Montessoro (si veda la nota a pagina 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei