• Non ci sono risultati.

Università degli Studi di Udine

N/A
N/A
Protected

Academic year: 2021

Condividi "Università degli Studi di Udine"

Copied!
15
0
0

Testo completo

(1)

FONDAMENTI DI INFORMATICA

Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI

Facoltà di Ingegneria

Università degli Studi di Udine

Linguaggio C

I puntatori

(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

Nota di Copyright

(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

(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

(5)

Esempio

int x = 5;

int *ip;

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

*ip = 0; /* adesso *ip vale 0,

e anche x */

(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

(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 ...

...

(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!

(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!

(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

(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

(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

(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

(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 !

(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

Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero

Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero

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

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

Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero

uguali con il carattere riservato seguito da uno solo dei byte ripetuti più un.. contatore del numero

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

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