Scarica puntatori 07 informatica.pdf e più Schemi e mappe concettuali in PDF di Informatica solo su Docsity!
Linguaggio C:
i puntatori
Il puntatore
E` un tipo di dato scalare, che consente di
rappresentare gli indirizzi delle variabili allocate in
memoria.
Dominio:
Il dominio di una variabile di tipo puntatore è un
insieme di indirizzi: il valore di una variabile P di
tipo puntatore puo` essere l’indirizzo di un’altra
variabile (variabile puntata ). puntatore indirizzo di .. variabile puntata V P
Il puntatore in C
Operatori :
- Assegnamento (=) : e` possibile l'assegnamento tra puntatori (dello stesso tipo). E' disponibile la costante NULL, per indicare l'indirizzo nullo.
- *Dereferencing ( ) : è un operatore unario. Si applica a un puntatore e restituisce il valore contenuto nella cella puntata => serve per accedere alla variabile puntata.
- Operatori aritmetici (vedi vettori & puntatori).
- Operatori relazionali :>,<,==, !=
- [Operatore indirizzo: si applica ad una variabile e restituisce l'indirizzo della cella di memoria nella quale e
allocata la variabile.] **Ad esempio: int *p1, *p2; int A; p1 = &A; *p1 = 127; p2 = p1; p1 = NULL;/* NULL e la costante che denota il** *puntatore nullo / A p p
Il puntatore in C
Operatori :
- Assegnamento (=) : e` possibile l'assegnamento tra puntatori (dello stesso tipo). E' disponibile la costante NULL, per indicare l'indirizzo nullo.
- *Dereferencing ( ) : è un operatore unario. Si applica a un puntatore e restituisce il valore contenuto nella cella puntata => serve per accedere alla variabile puntata.
- Operatori aritmetici (vedi vettori & puntatori).
- Operatori relazionali :>,<,==, !=
- [Operatore indirizzo: si applica ad una variabile e restituisce l'indirizzo della cella di memoria nella quale e` allocata la variabile.] **Ad esempio: int *p1, p2; int A; p1 = &A; p1 = 127; p2 = p1; p1 = NULL; A p p
Il puntatore in C
Operatori :
- Assegnamento (=) : e` possibile l'assegnamento tra puntatori (dello stesso tipo). E' disponibile la costante NULL, per indicare l'indirizzo nullo.
- *Dereferencing ( ) : è un operatore unario. Si applica a un puntatore e restituisce il valore contenuto nella cella puntata => serve per accedere alla variabile puntata.
- Operatori aritmetici (vedi vettori & puntatori).
- Operatori relazionali :>,<,==, !=
- [Operatore indirizzo: si applica ad una variabile e restituisce l'indirizzo della cella di memoria nella quale e` allocata la variabile.] **Ad esempio: int *p1, p2; int A; p1 = &A; p1 = 127; p2 = p1; p1 = NULL; A p p 127
Il puntatore in C
Operatori :
- Assegnamento (=) : e` possibile l'assegnamento tra puntatori (dello stesso tipo). E' disponibile la costante NULL, per indicare l'indirizzo nullo.
- *Dereferencing ( ) : è un operatore unario. Si applica a un puntatore e restituisce il valore contenuto nella cella puntata => serve per accedere alla variabile puntata.
- Operatori aritmetici (vedi vettori & puntatori).
- Operatori relazionali :>,<,==, !=
- [Operatore indirizzo: si applica ad una variabile e restituisce l'indirizzo della cella di memoria nella quale e` allocata la variabile.] **Ad esempio: int *p1, p2; int A; p1 = &A; p1 = 127; p2 = p1; p1 = NULL; A p p 127
Il puntatore in C: * e &
Operatore Indirizzo &:
- & si applica solo ad oggetti che esistono in memoria (quindi, gia` definiti).
- & non e` applicabile ad espressioni. *Operatore Dereferencing :
- consente di accedere ad una variabile specificandone l'indirizzo
- l'indirizzo rappresenta un modo alternativo al nome ( alias ) per accedere e manipolare la variabile: Ad esempio: float p; float R, A; p=&A; / p è un alias di A/ R=2; p=3.14R; / A è modificato / A p R
Il puntatore in C: * e &
Operatore Indirizzo &:
- & si applica solo ad oggetti che esistono in memoria (quindi, gia` definiti).
- & non e` applicabile ad espressioni. *Operatore Dereferencing :
- consente di accedere ad una variabile specificandone l'indirizzo
- l'indirizzo rappresenta un modo alternativo al nome ( alias ) per accedere e manipolare la variabile: Ad esempio: float p; float R, A; p=&A; / p è un alias di A/ R=2; p=3.14R; / A è modificato / A p 2 R
Puntatore come costruttore di tipo
Il costruttore di tipo "*" puo` essere anche usato per dichiarare tipi non primitivi basati sul puntatore. *Dichiarazione di un tipo puntatore: typedef ;
- e` il tipo della variabile puntata
- e` il nome del tipo dichiarato. **Ad esempio: typedef float tpf; tpf p; float f; p=&f; p=0.56;
Puntatori: controlli di tipo
Nella definizione di un puntatore e**necessario** indicare il tipo della variabile puntata. il compilatore **puo** effettuare controlli statici sull'uso dei puntatori. Esempio: typedef struct{int campo1; float campo2;}record; int p, A; record q, X; p=&A; q=p; /warning!/ q=&X; p=q; / errore! / Viene segnalato dal compilatore ( warning ) il tentativo di utilizzo congiunto di puntatori a tipi differenti.
Variabili Dinamiche
Variabili dinamiche:
- Le variabili dinamiche devono essere allocate e deallocate
esplicitamente dal programmatore.
- L'area di memoria in cui vengono allocate le variabili dinamiche
si chiama heap.
- Le variabili dinamiche non hanno un identificatore , ma possono essere riferite soltanto attraverso il loro indirizzo (mediante i
puntatori ).
- Il tempo di vita delle variabili dinamiche e` l'intervallo di tempo che intercorre tra l'allocazione e la deallocazione (che sono impartite esplicitamente dal programmatore).
Variabili Dinamiche in C
Il C prevede funzioni standard di allocazione e deallocazione per variabili dinamiche:
- Allocazione: malloc
- Deallocazione: free malloc e free sono definite a livello di sistema operativo, mediante la libreria standard <stdlib.h> ( da includere nei programmi che le usano).
Variabili Dinamiche
Allocazione di variabili dinamiche: La memoria dinamica viene allocata con la funzione standard malloc. La sintassi da usare e`: *punt = (tipodato )malloc(sizeof(tipodato)); dove:
- tipodato e` il tipo della variabile puntata
- punt e` una variabile di tipo **tipodato ***
- sizeof() e` una funzione standard che calcola il numero di bytes che occupa il dato specificato come argomento
- e` necessario convertire esplicitamente il tipo del valore ritornato ( casting): *(tipodato ) malloc(..) Significato : La malloc provoca la creazione di una variabile dinamica
nell’ heap e restituisce l'indirizzo della variabile creata.
Variabili Dinamiche
Esempio:
**#include <stdlib.h> typedef int tp; tp punt; ... punt=(tp )malloc(sizeof(int)); punt=12; heap punt