Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Introduzione ai Puntatori in C++: Dichiarazione, Allocazione, Deallocazione e Operatori - , Appunti di Programmazione C

Una introduzione ai puntatori in c++ con esempi pratici sulla dichiarazione, allocazione, deallocazione e l'uso degli operatori di indirizzo & e dereferenziazione *. Il documento copre anche la differenza tra puntatori e riferimenti.

Tipologia: Appunti

2018/2019

Caricato il 15/05/2019

manroop-singh
manroop-singh 🇮🇹

1 documento

1 / 30

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
1.1.1
-AA. 2018/19
Parte 1 -Liste
Puntatori
[S. Dalí The temptation of St. Anthony, 1946]
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e

Anteprima parziale del testo

Scarica Introduzione ai Puntatori in C++: Dichiarazione, Allocazione, Deallocazione e Operatori - e più Appunti in PDF di Programmazione C solo su Docsity!

Parte 1 - Liste

Puntatori

[S. Dalí – The temptation of St. Anthony, 1946]

Puntatori

Approfondimento rispetto alla trattazione vista nel

corso precedente

Finora come avete utilizzato i puntatori?

Principalmente per memorizzare indirizzi di array allocati in memoria dinamica Ma i puntatori possono essere utilizzati per riferire oggetti di ogni tipo *int p=new int[N];

Esempi (1)

*main() { int p ; // puntatore ad un oggetto di // tipo int p = new int ; // allocazione di un oggetto // dinamico di tipo int: // NON è un array! delete p ; // deallocazione di un oggetto // puntato da p }

Esempi (2)

*main() { struct s {int a, b ;} ; s p2 ; // punt. ad un oggetto di tipo s p2 = new s ; // allocazione di un oggetto // dinamico di tipo s: delete p2 ; // deallocazione oggetto // puntato da p }

Ripasso

Cosa rappresentano i seguenti oggetti? const int p // puntatore ad oggetto di tipo int, // non modificabile tramite p int * const p // puntatore costante ad oggetto di // tipo int int * p[10] // array di 10 puntatori ad int int (p)[10] // puntatore ad array di 10 interi int *p = new int[10] // puntatore (ad int) al I // elemento di un array di // 10 int allocato in // memoria dinamica

Operatore di indirizzo

L'operatore di indirizzo & restituisce l'indirizzo di memoria dell'oggetto a cui viene applicato Operatore unario e prefisso Il risultato restituito dall'operatore di indirizzo può essere assegnato ad un puntatore ad un oggetto dello stesso tipo

  • &x può essere tradotto come “l'indirizzo di x

Esempi

*main() { int i, j; int p = &i; int * const p2 = &j; //in alcuni casi //è bene usare questa //definizione p = p2; // equivale a p = indirizzo di j int k; p2 = &k; // genera un errore a tempo di // compilazione – p2 costante }

Operatore di dereferenziazione

Per accedere all'oggetto riferito da un puntatore si usa l' *operatore di dereferenziazione ** Operatore unario e prefisso Si dice che il puntatore viene dereferenziato L'operatore * applicato ad un puntatore ritorna un riferimento all'oggetto puntato

  • *p puo' essere tradotto come “l'oggetto puntato da p

Osservazione

L'uso dei puntatori è una delle aree più inclini ad errori della programmazione moderna Alcuni linguaggi come Java, C# e Visual Basic non forniscono alcun tipo di dato puntatore Problemi tipici:

  • Dangling reference (puntatore pendente): il puntatore punta ad un’are di memoria già liberata (tramite l’operatore free)
  • Memory leak: la memoria alloccata non viene liberata (tramite l’operatore free)

Stampa di puntatori

Il valore di un puntatore, così come del risultato dell'operatore di indirizzo & , può essere stampato mandandolo sullo stream di uscita mediante l'operatore << Di norma l'operatore << mette sullo stream di uscita la sequenza di caratteri che rappresenta il valore di un puntatore in base 16 Vedi programma indirizzo_punt.cc

Selettori di campo

ESEMPIO

struct s {int a, b ;};

s *p;

Oggetto di tipo struttura indirizzato da un puntatore p

Due modi per riferire ad un campo della struttura

indirizzata da p (ad esempio a )

1) (*p).m

2) p->m

Nota: l'operatore. ha una precedenza maggiore

dell'operatore * → necessarie le parentesi

Esempi

main() { struct s {int a, b;} s1; s p2; // punt. ad un oggetto di tipo s p2 = &s1; (p2).a = 3; // equivalente a s1.a = 3 p2->a = 3; // equivalente all'istruzione // precedente }

Riferimenti come alias

int & rif = n; Definisce una variabile rif di tipo “riferimento a int” e la inizializza al valore n rif è un sinonimo di n ESEMPIO void main() { int n=75; int & rif=n; cout<<“n=”<<n<<”, rif=”<<rif<<”, “; rif = 30; cout<<“n=”<<n<<”, rif=”<<rif<<”, “; } Stampa: n=75, rif=75, n=30, rif=

Puntatori e riferimenti

  • I riferimenti sono meno flessibili, ma meno pericolosi dei puntatori
  • Riferimento : realizzato mediante un puntatore costante nascosto (non visibile al programmatore) che ha per valore l'indirizzo dell'oggetto riferito int & rif = n; Corrisponde a: int * __ptr_rif = &n; // puntatore nascosto
  • Ogni operazione che coinvolge l'oggetto riferito è realizzata da una dereferenziazione sul puntatore nascosto ogni volta che viene usato rif viene sostituito da ( *__ptr_rif ) Differenze sostanziali tra riferimenti e puntatori :
    • I riferimenti non possono avere valore nullo → necessaria inizializzazione
    • I riferimenti non possono poi essere riassegnati