SlideShare uma empresa Scribd logo
1 de 76
Puntatori & Riferimenti
Ilio Catallo – info@iliocatallo.it
Indice
¤ Il problema dello swap
¤ Puntatori
¤ Reference
2
Il problema dallo swap
Il problema dello swap
¤ Supponiamo che in un programma avvenga
frequentemente lo scambio (swap) tra due interi
4
2 inta: 5 intb:
Il problema dello swap
¤ IDEA: Scrivere una funzione int_swap e richiamarla
ovunque necessario
int main() {
...
int a = 2, b = 5;
...
int_swap(a, b); // expected result: a = 5, b = 2
}
5
Il problema dello swap
¤ Come scrivere int_swap?
6
Il problema dello swap
¤ Un possibile tentativo potrebbe essere:
¤ La soluzione sembra immediata…ma funziona?
void int_swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
7
Il problema dello swap
8
Il problema dello swap
¤ All’invocazione di int_swap:
¤ I valori di a e b nella funzione chiamante vengono copiati
nelle variabili locali x e y
¤ i valori di x e y vengono scambiati, ma…
¤ Le variabili a e b nel chiamante rimangono intoccate
...
int a = 2, b = 5;
int_swap(a, b); // x and y are copies of a and b,
// hence a and b remain unchanged
9
Il problema dello swap
¤ Non è possibile scrivere la funzione int_swap passando
le variabili per copia
10
#@?$!
Puntatori
Organizzazione della memoria
¤ La memoria può essere immaginata come una
successione di celle di memoria
¤ Ogni cella occupa la minima dimensione che il
calcolatore è in grado di gestire (1 byte*)
*1 byte è il quantitativo più comune
12
Organizzazione della memoria
¤ Ad ogni cella è associato un indirizzo crescente
13
Organizzazione della memoria
¤ L’indirizzo di una cella è pari a quella della precedente
più uno
14
Organizzazione della memoria
¤ In questo modo:
¤ Ogni cella ha un indirizzo univoco
¤ È nota una regola per passare da una cella alle successive
15
Nome di una variabile
¤ Il nome della variabile è lo strumento usato per accedere
al contenuto della memoria riservata a tale variabile
int a = 5;
int b = a + 5; // we use the data contained in ‘a’
// without knowing its physical
// location in memory
16
Variabili e memoria
¤ In virtù del fatto che ogni variabile ha un nome, non
dobbiamo solitamente preoccuparci di dove i dati
vengano memorizzati
17
1775 17771776 1778 1779 1780
int a
Variabili e memoria
¤ Ciononostante, una variabile occupa una o più celle di
memoria
18
1775 17771776 1778 1779 1780
int a
Indirizzo di una variabile
¤ Quando vogliamo riferirci all’indirizzo di una variabile,
piuttosto che il suo valore, utilizziamo la sintassi
&nome_variabile
19
1775 17771776 1778 1779 1780
int a&a
Indirizzo di una variabile
¤ L’espressione &a può essere letta come “indirizzo di a”
20
1775 17771776 1778 1779 1780
int a&a
Indirizzo di una variabile
¤ Data dunque la definizione:
¤ Si ha che:
¤ a si riferisce al contenuto della variabile (5 in questo caso)
¤ &a si riferisce all’indirizzo dove tale contenuto risiede in
memoria
21
int a = 5;
Indirizzo di una variabile
¤ Esempio: stampare a video l’indirizzo di una variabile
22
int a = 5;
std::cout << "the address of a is " << &a
<< std::endl;
Indirizzo di una variabile
¤ Quando il simbolo & precede un’espressione, questo
assume il ruolo di operatore (address-of operator)
23
int a = 5;
std::cout << "the address of a is " << &a
<< std::endl;
Indirizzo di una variabile
¤ Nota: se una variabile occupa più di una cella di
memoria, l’operatore & restituisce l’indirizzo della prima
cella di memoria utilizzata
1775 17771776 1778 1779 1780
int a&a
24
Dimensione dei tipi dati in C++
¤ Non esistono dimensioni prefissate dei tipi dati
¤ La dimensione in byte di ogni tipo dato è dipendente
dall’architettura del calcolatore e dal compilatore
¤ Lo standard C++ specifica unicamente il minimo intervallo di
valori memorizzabili
25
Dimensione dei tipi dati in C++
¤ Esempio: un int deve permettere di memorizzare numeri
interi tra -32’767 e +32’767
¤ Tipica dimensione su architettura Intel 16-bit: 2 byte
¤ Tipica dimensione su architettura Intel 32-bit: 4 byte
26
Memorizzare un indirizzo
¤ La stampa di un indirizzo non è particolarmente utile
¤ Supponiamo invece di voler memorizzare l’indirizzo di a,
in modo da poterlo riutilizzare successivamente
¤ Abbiamo bisogno di una variabile address_of_a il cui
contenuto sia l’indirizzo di a
int a = 5;
std::cout << "the address of a is " << &a
<< std::endl;
27
Memorizzare un indirizzo
? address_of_a = &a;
&aaddress_of_a:5a: int ?
28
Memorizzare un indirizzo
¤ La variabile address_of_a deve contenere
“l’indirizzo di una variabile di tipo int”
29
? address_of_a = &a;
Memorizzare un indirizzo
¤ Qual è il tipo dato di address_of_a?
30
? address_of_a = &a;
Memorizzare un indirizzo
¤ Il tipo dato di una variabile che contiene l’indirizzo di un
intero è int*
¤ Il tipo dato int* si chiama puntatore a intero
int* address_of_a = &a;
31
Puntatori
¤ Variabili che contengono indirizzi sono chiamate
puntatori
¤ Una variable di tipo T* può contenere l’indirizzo di una
variabile di tipo T
¤ È possibile creare puntatori a qualsiasi tipo dato*,
indipendentemente che questo sia predefinito o creato
dall’utente
Per un tipo dato T, T* è il tipo dato puntatore a T
* Purchè il tipo dato non sia più piccolo di 1 byte
32
Esempi di puntatori
¤ Regola (del pollice) per interpretare il tipo dato:
¤ Il più a destra degli asterischi * si legge “puntatore a…”
¤ Tutto ciò che segue da destra a sinistra è il tipo puntato
int* a; // pointer to int
char* b; // pointer to char
float* c; // pointer to float
int** d; // pointer to pointer to int
Per un tipo dato T, T* è il tipo dato puntatore a T
33
XKCD
34
Accedere al contenuto di una
variabile
¤ Supponiamo che qualcuno ci fornisca un puntatore a
intero ptr contenente l’indirizzo di una variabile intera
35
int* ptr = ... // somehow initialized
Accedere al contenuto di una
variabile
¤ Possiamo usare l’indirizzo memorizzato in ptr per
accedere al contenuto della variabile puntata?
36
int* ptr = ... // somehow initialized
Indirezione
¤ Dato un puntatore, è possibile accedere al contenuto
della variabile puntata attraverso l’operatore *
(indirection operator)
int* ptr = ... // somehow initialized
std::cout << "the value of the variable
pointed to by ptr is " << *ptr << std::endl;
37
Indirezione
¤ L’espressione *ptr può essere letta come
“il valore della variabile puntata da ptr”
int* ptr = ... // somehow initialized
std::cout << "the value of the variable
pointed to by ptr is " << *ptr << std::endl;
38
Indirezione
¤ L’operatore di indirezione può essere usato sia per
leggere che per modificare il valore della variabile
puntata
int* ptr = ... // somehow initialized
*ptr = 7;
int b = 5 + *ptr; // b contains 12
39
Indirezione
¤ In altre parole, l’espressione *ptr può apparire a sinistra
dell’operatore di assegnamento
40
int* ptr = ... // somehow initialized
*ptr = 7;
int b = 5 + *ptr; // b contains 12
Indirezione
&aaddress_of_a:
5a: int
int*
41
Geek&Poke
42
Metodi d’accesso
¤ È possibile quindi accedere al contenuto di una variabile
in due modi:
¤ Attraverso il suo nome
¤ Attraverso il suo indirizzo (memorizzato in un puntatore)
¤ L’accesso mediante puntatore è indiretto
¤ per accedere al contenuto della variabile puntata è
necessario prima accedere al contenuto del puntatore
43
Puntatori nulli
¤ Come per tutte le variabili locali, non è possibile
conoscere il valore di un puntatore non inizializzato
44
int* ptr; // uninitialized pointer
Puntatori nulli
¤ Il puntatore potrebbero contenere un qualsiasi valore
45
int* ptr; // uninitialized pointer
Puntatori nulli
¤ Tale valore casuale potrebbe essere interpretato come
l’indirizzo di un ipotetica variabile puntata dal puntatore
46
int* ptr; // uninitialized pointer
Puntatori nulli
¤ Non esiste alcun modo di capire se il valore contenuto in
un puntatore rappresenti o meno un indirizzo valido
47
int* ptr; // uninitialized pointer
Puntatori nulli
¤ È molto facile trovarsi ad utilizzare un puntatore non
inizializzato senza nemmeno rendersene conto
48
int* ptr; // uninitialized pointer
Puntatori nulli
¤ Per evitare il rischio di avere puntatori non inizializzati
sarebbe sufficiente inizializzare un puntatore solo dopo
aver definito la variabile da puntare
49
int a = 5;
int* ptr = &a;
Puntatori nulli
¤ Purtroppo, ciò non è sempre realizzabile
¤ in alcuni casi non è effettivamente possibile creare la
variabile da puntare prima dell’inizializzazione del puntatore
¤ Anche senza una variabile da puntare, sarebbe
preferibile evitare rischi inizializzando il puntatore.
50
Puntatori nulli
¤ È possibile inizializzare un puntatore e al contempo
indicare che non è ancora disponibile la corrispettiva
variabile a cui puntare
¤ Per farlo si inizializza il puntatore al valore:
¤ NULL (fino al C++03) o
¤ nullptr (dal C++11)
51
Puntatori nulli
¤ L’espressione può essere letta come
“il puntatore ptr non punta a nulla”
int* ptr = nullptr; // 'ptr’ is not
// pointing to anything
52
Il problema dello swap:
soluzione
¤ Come possiamo usare i puntatori per riuscire a scrivere la
funzione int_swap?
53
Il problema dello swap:
soluzione
¤ IDEA: invece di passare una copia del contenuto delle
variabili, passare una copia del loro indirizzo
void int_swap(int* x, int* y) {
int temp = *x;
*x = *y;
*y = temp;
}
54
Il problema dello swap:
soluzione
¤ All’invocazione di int_swap:
¤ Gli indirizzi di a e b nella funzione chiamante vengono
copiati nelle variabili puntatore locali x e y
¤ Si scambiano i valori delle variabili puntate da x e y
(ovvero a e b)
¤ Al termine della funzione int_swap le variabili locali x e y
vengono distrutte
¤ Come invocare la nuova funzione int_swap?
55
Il problema dello swap:
soluzione
¤ Sappiamo che:
¤ La funzione int_swap si aspetta in ingresso gli indirizzi delle
variabili da scambiare
¤ Per ottenere l’indirizzo di una variabile si usa l’operatore &
56
Il problema dello swap:
soluzione
¤ Se vogliamo scambiare il contenuto di a e b dobbiamo
quindi fornire l’indirizzo di a (&a) e l’indirizzo di b (&b)
int main() {
...
int a = 2, b = 5;
...
int_swap(&a, &b); // now: a = 5, b = 2
}
57
Passaggio per indirizzo
¤ Se una funzione riceve una copia delll’indirizzo di una
variabile piuttosto che un copia del suo valore, si parla di
passaggio per indirizzo
¤ Il passaggio per indirizzo permette di:
¤ Riflettere le modifiche attutate nella funziona chiamata
anche alla funzione chiamante
¤ Accedere rapidamente a dati corposi, dato che nessuna
copia del dato viene creata
¤ Simulare il ritorno di più variabili da una funzione
58
Problema risolto?
¤ Siamo soddisfatti della nostra soluzione?
¤ Il metodo funziona, ma…
¤ Il codice è diventato difficile da leggere
¤ dovremmo gestire il caso di particolare in cui viene passato
nullptr come indirizzo
¤ Possiamo fare di meglio?
int_swap(&a, &b);
59
Riferimenti
Inizializzare una variabile
¤ Al momento dell’inizializzazione di una variabile, il valore
della variabile inizializzatrice viene copiato nella nuova
variabile
¤ Al termine dell’inizializzazione, ognuna delle due variabili
contiene la propria copia dello stesso valore
¤ La nuova variabile vive una vita indipendente, il
cambiamento del suo valore non altera quello della
variabile inizializzatrice
61
Dichiarare una variabile
¤ Quando una variabile viene dichiarata, se ne specifica il
tipo e l’identificativo (nome)
¤ Entrambi questi aspetti non sono modificabili in un
secondo momento
¤ Non è possibile tramutare una variabile di tipo T in una
variabile di tipo T’*
¤ Non è possibile mutare l’identificativo (cambiare nome ad
una variabile)
* ricorda che il casting crea una nuova variabile,
non cambia la natura di una variabile esistente
62
Alias di una variabile
¤ Il C++ permette però di inizializzare nomi aggiuntivi (alias)
per una variabile:
int a = 5;
int& b = a; // b is a new name (alias) for a
63
Alias di una variabile
¤ b non indica una nuova area di memoria, b è solo un
altro nome per a
int a = 5;
int& b = a; // b is a new name (alias) for a
64
Alias di una variabile
¤ b è una variabile di tipo int&, ovvero un alias di una
variabile di tipo int
int a = 5;
int& b = a; // b is a new name (alias) for a
65
Riferimenti
¤ Gli alias di una variabile sono chiamati riferimenti
(reference*)
¤ L’inizializzazione di un riferimento non comporta la copia
del valore della variabile inizializzatrice, bensì
l’associazione (binding) del nuovo nome alla variabile
* Dal C++11 sono stati rinominati
lvalue reference
Per un tipo dato T, T& è il tipo dato riferimento a T
66
Esempi di riferimenti
¤ Regola (del pollice) per interpretare il tipo dato:
¤ L’ampersand & più a destra si legge “riferimento a…”
¤ Tutto ciò che segue da destra a sinistra è il tipo a cui ci si
riferisce
Per un tipo dato T, T& è il tipo dato riferimento a T
int& a = b; // a is a new name for b (where b is of type int)
float& c = d; // c is a new name for d (where d is of type
float)
int& e = b; // e is a new name for b, hence a new name for a
int*& f = g; // f is a new name for g (where g is of type int*)
67
Nuovo vs. vecchio nome
¤ Una volta inizializzato, usare il nuovo nome o il vecchio
nome è indifferente*
int a = 5;
int& b = a; // b is a new name (alias) for a
b = 7;
std::cout << a << std::endl; // the output will be '7'
std::cout << &a
<< &b
<< std::endl; //'a' and 'b' are the same thing,
// so the address is the same
* concetto riassumibile nella massima:
“the reference is the referent”
68
Limitazione dei riferimenti
¤ I riferimenti devono essere inizializzati
¤ I riferimenti non possono essere ri-assegnati:
¤ Non sono ammessi* riferimenti a riferimenti
int& b; //ERROR: b is a new name of which variable?
int a = 5, c = 10;
int& b = a;
b = c; // this does not mean that b is now a
// new name for c, the expression amounts to
// say “a = c”
* Dal C++11, esiste un unico strappo alla regola al fine
di permettere il perfect forwarding
69
Il problema dello swap:
soluzione
¤ I riferimenti ci permettono di scrivere la funzione
int_swap in maniera semplice e sicura
void swap(int& x, int& y) {
int temp = x;
x = y;
y = temp;
}
Il corpo della
funzione è uguale a
quanto scritto nella
prima (errata)
versione
70
Il problema dello swap:
soluzione
¤ I riferimenti ci permettono di scrivere la funzione
int_swap in maniera semplice e sicura:
¤ Semplice: non dobbiamo usare l’operatore di indirezione
ovunque
¤ Sicura: non possiamo per errore passare nullptr
71
Il problema dello swap:
soluzione
¤ Per scambiare i valori di a e b, invochiamo la funzione
int_swap esattamente come una qualsiasi altra funzione
72
int main() {
...
int a = 2, b = 5;
...
int_swap(a, b); // now: a = 5, b = 2
}
Il problema dello swap:
soluzione
¤ In questo modo:
¤ x è un alias per a
¤ y è un alias per b
int main() {
...
int a = 2, b = 5;
...
int_swap(a, b); // now: a = 5, b = 2
}
73
Il problema dello swap:
soluzione
¤ Modificare x e y è la stessa cosa che modificare a e b
74
int main() {
...
int a = 2, b = 5;
...
int_swap(a, b); // now: a = 5, b = 2
}
Bibliografia
Bibliografia
¤ S. B. Lippman, J. Lajoie, B. E. Moo, C++ Primer (5th Ed.)
¤ B. Stroustrup, The C++ Programming Language (4th Ed.)
¤ R. Lafore, Object Oriented Programming in C++ (4th Ed.)
¤ C++FAQ, Section 8
http://www.parashift.com/c++-faq/references.html
76

Mais conteúdo relacionado

Mais procurados

Alocação Dinâmica em Linguagem C
Alocação Dinâmica em Linguagem CAlocação Dinâmica em Linguagem C
Alocação Dinâmica em Linguagem CGlécio Rodrigues
 
pointers,virtual functions and polymorphism
pointers,virtual functions and polymorphismpointers,virtual functions and polymorphism
pointers,virtual functions and polymorphismrattaj
 
Operator overloading C++
Operator overloading C++Operator overloading C++
Operator overloading C++Lahiru Dilshan
 
What is Range Function? | Range in Python Explained | Edureka
What is Range Function? | Range in Python Explained | EdurekaWhat is Range Function? | Range in Python Explained | Edureka
What is Range Function? | Range in Python Explained | EdurekaEdureka!
 
C Pointers
C PointersC Pointers
C Pointersomukhtar
 
Pointer in c program
Pointer in c programPointer in c program
Pointer in c programRumman Ansari
 
BKK16-503 Undefined Behavior and Compiler Optimizations – Why Your Program St...
BKK16-503 Undefined Behavior and Compiler Optimizations – Why Your Program St...BKK16-503 Undefined Behavior and Compiler Optimizations – Why Your Program St...
BKK16-503 Undefined Behavior and Compiler Optimizations – Why Your Program St...Linaro
 

Mais procurados (16)

Embedded C - Lecture 3
Embedded C - Lecture 3Embedded C - Lecture 3
Embedded C - Lecture 3
 
Alocação Dinâmica em Linguagem C
Alocação Dinâmica em Linguagem CAlocação Dinâmica em Linguagem C
Alocação Dinâmica em Linguagem C
 
pointers,virtual functions and polymorphism
pointers,virtual functions and polymorphismpointers,virtual functions and polymorphism
pointers,virtual functions and polymorphism
 
Operator overloading C++
Operator overloading C++Operator overloading C++
Operator overloading C++
 
File Handling.pptx
File Handling.pptxFile Handling.pptx
File Handling.pptx
 
What is Range Function? | Range in Python Explained | Edureka
What is Range Function? | Range in Python Explained | EdurekaWhat is Range Function? | Range in Python Explained | Edureka
What is Range Function? | Range in Python Explained | Edureka
 
C Pointers
C PointersC Pointers
C Pointers
 
Structures
StructuresStructures
Structures
 
Embedded C - Lecture 4
Embedded C - Lecture 4Embedded C - Lecture 4
Embedded C - Lecture 4
 
pointers
pointerspointers
pointers
 
Pointer in c program
Pointer in c programPointer in c program
Pointer in c program
 
Pointers.pptx
Pointers.pptxPointers.pptx
Pointers.pptx
 
BKK16-503 Undefined Behavior and Compiler Optimizations – Why Your Program St...
BKK16-503 Undefined Behavior and Compiler Optimizations – Why Your Program St...BKK16-503 Undefined Behavior and Compiler Optimizations – Why Your Program St...
BKK16-503 Undefined Behavior and Compiler Optimizations – Why Your Program St...
 
Data types in c++
Data types in c++ Data types in c++
Data types in c++
 
Pointers in c++ by minal
Pointers in c++ by minalPointers in c++ by minal
Pointers in c++ by minal
 
C fundamental
C fundamentalC fundamental
C fundamental
 

Destaque

プロデザイナーが実践するHTML&CSSスキル向上トレーニング〜Wikipedia編 先生:笠井 枝理依
プロデザイナーが実践するHTML&CSSスキル向上トレーニング〜Wikipedia編 先生:笠井 枝理依プロデザイナーが実践するHTML&CSSスキル向上トレーニング〜Wikipedia編 先生:笠井 枝理依
プロデザイナーが実践するHTML&CSSスキル向上トレーニング〜Wikipedia編 先生:笠井 枝理依schoowebcampus
 
Funeral_Guest_Book sign in
Funeral_Guest_Book sign inFuneral_Guest_Book sign in
Funeral_Guest_Book sign inDarcas Reed
 
Graduation announcement 4 x 6 #2
Graduation announcement 4 x 6 #2Graduation announcement 4 x 6 #2
Graduation announcement 4 x 6 #2Darcas Reed
 
Birth Announcement 4 x 6 #2
Birth Announcement 4 x 6  #2Birth Announcement 4 x 6  #2
Birth Announcement 4 x 6 #2Darcas Reed
 
スマホ最適化のためのデザイン・コーディング実習 先生:池田 祐太郎
スマホ最適化のためのデザイン・コーディング実習 先生:池田 祐太郎スマホ最適化のためのデザイン・コーディング実習 先生:池田 祐太郎
スマホ最適化のためのデザイン・コーディング実習 先生:池田 祐太郎schoowebcampus
 
GRASSO_PHILLIP_SAMPLE_BOOKLET
GRASSO_PHILLIP_SAMPLE_BOOKLETGRASSO_PHILLIP_SAMPLE_BOOKLET
GRASSO_PHILLIP_SAMPLE_BOOKLETPhillip Grasso
 
「乗る」タイミングを掴む、劇的なテクノロジー進化とビジネス動向 先生:香田 夏雄
「乗る」タイミングを掴む、劇的なテクノロジー進化とビジネス動向 先生:香田 夏雄「乗る」タイミングを掴む、劇的なテクノロジー進化とビジネス動向 先生:香田 夏雄
「乗る」タイミングを掴む、劇的なテクノロジー進化とビジネス動向 先生:香田 夏雄schoowebcampus
 
よりよい企画作りに役立つデザイナー的思考 先生:灰色 ハイジ
よりよい企画作りに役立つデザイナー的思考 先生:灰色 ハイジよりよい企画作りに役立つデザイナー的思考 先生:灰色 ハイジ
よりよい企画作りに役立つデザイナー的思考 先生:灰色 ハイジschoowebcampus
 
アイデア出しの方法
アイデア出しの方法アイデア出しの方法
アイデア出しの方法Yuto Suzuki
 
Birth Announcement 4 x 6 #1
Birth Announcement 4 x 6  #1Birth Announcement 4 x 6  #1
Birth Announcement 4 x 6 #1Darcas Reed
 
スタートアップのPR会議に参加して鍛える企画力【Cu-hacker編】 先生:秋貞 雄大
スタートアップのPR会議に参加して鍛える企画力【Cu-hacker編】 先生:秋貞 雄大スタートアップのPR会議に参加して鍛える企画力【Cu-hacker編】 先生:秋貞 雄大
スタートアップのPR会議に参加して鍛える企画力【Cu-hacker編】 先生:秋貞 雄大schoowebcampus
 
Apresentação Institucional - Simplifique Desenvolvimento de Pessoas e Negócios
Apresentação Institucional - Simplifique Desenvolvimento de Pessoas e NegóciosApresentação Institucional - Simplifique Desenvolvimento de Pessoas e Negócios
Apresentação Institucional - Simplifique Desenvolvimento de Pessoas e NegóciosSIMPLIFIQUE! RH
 
Características de las tics
Características de las ticsCaracterísticas de las tics
Características de las ticsgabrielaguio
 
Recrutamento & Seleção para Pequenas Empresas
Recrutamento & Seleção para Pequenas EmpresasRecrutamento & Seleção para Pequenas Empresas
Recrutamento & Seleção para Pequenas EmpresasSIMPLIFIQUE! RH
 
【HARES 西村】働き方改革講演資料(17/01/31)
【HARES 西村】働き方改革講演資料(17/01/31)【HARES 西村】働き方改革講演資料(17/01/31)
【HARES 西村】働き方改革講演資料(17/01/31)Souichirou Nishimura
 
「初心者向けデザイン講座」 -東洋美術学校(第三回目:色編)
「初心者向けデザイン講座」 -東洋美術学校(第三回目:色編)「初心者向けデザイン講座」 -東洋美術学校(第三回目:色編)
「初心者向けデザイン講座」 -東洋美術学校(第三回目:色編)schoowebcampus
 
ヒットを企てる人のための構造分析入門
ヒットを企てる人のための構造分析入門ヒットを企てる人のための構造分析入門
ヒットを企てる人のための構造分析入門schoowebcampus
 

Destaque (20)

プロデザイナーが実践するHTML&CSSスキル向上トレーニング〜Wikipedia編 先生:笠井 枝理依
プロデザイナーが実践するHTML&CSSスキル向上トレーニング〜Wikipedia編 先生:笠井 枝理依プロデザイナーが実践するHTML&CSSスキル向上トレーニング〜Wikipedia編 先生:笠井 枝理依
プロデザイナーが実践するHTML&CSSスキル向上トレーニング〜Wikipedia編 先生:笠井 枝理依
 
Funeral_Guest_Book sign in
Funeral_Guest_Book sign inFuneral_Guest_Book sign in
Funeral_Guest_Book sign in
 
Graduation announcement 4 x 6 #2
Graduation announcement 4 x 6 #2Graduation announcement 4 x 6 #2
Graduation announcement 4 x 6 #2
 
Educación 2.0
Educación 2.0Educación 2.0
Educación 2.0
 
Birth Announcement 4 x 6 #2
Birth Announcement 4 x 6  #2Birth Announcement 4 x 6  #2
Birth Announcement 4 x 6 #2
 
スマホ最適化のためのデザイン・コーディング実習 先生:池田 祐太郎
スマホ最適化のためのデザイン・コーディング実習 先生:池田 祐太郎スマホ最適化のためのデザイン・コーディング実習 先生:池田 祐太郎
スマホ最適化のためのデザイン・コーディング実習 先生:池田 祐太郎
 
GRASSO_PHILLIP_SAMPLE_BOOKLET
GRASSO_PHILLIP_SAMPLE_BOOKLETGRASSO_PHILLIP_SAMPLE_BOOKLET
GRASSO_PHILLIP_SAMPLE_BOOKLET
 
「乗る」タイミングを掴む、劇的なテクノロジー進化とビジネス動向 先生:香田 夏雄
「乗る」タイミングを掴む、劇的なテクノロジー進化とビジネス動向 先生:香田 夏雄「乗る」タイミングを掴む、劇的なテクノロジー進化とビジネス動向 先生:香田 夏雄
「乗る」タイミングを掴む、劇的なテクノロジー進化とビジネス動向 先生:香田 夏雄
 
GALA EMBALAGENS
GALA EMBALAGENSGALA EMBALAGENS
GALA EMBALAGENS
 
よりよい企画作りに役立つデザイナー的思考 先生:灰色 ハイジ
よりよい企画作りに役立つデザイナー的思考 先生:灰色 ハイジよりよい企画作りに役立つデザイナー的思考 先生:灰色 ハイジ
よりよい企画作りに役立つデザイナー的思考 先生:灰色 ハイジ
 
アイデア出しの方法
アイデア出しの方法アイデア出しの方法
アイデア出しの方法
 
Birth Announcement 4 x 6 #1
Birth Announcement 4 x 6  #1Birth Announcement 4 x 6  #1
Birth Announcement 4 x 6 #1
 
スタートアップのPR会議に参加して鍛える企画力【Cu-hacker編】 先生:秋貞 雄大
スタートアップのPR会議に参加して鍛える企画力【Cu-hacker編】 先生:秋貞 雄大スタートアップのPR会議に参加して鍛える企画力【Cu-hacker編】 先生:秋貞 雄大
スタートアップのPR会議に参加して鍛える企画力【Cu-hacker編】 先生:秋貞 雄大
 
Apresentação Institucional - Simplifique Desenvolvimento de Pessoas e Negócios
Apresentação Institucional - Simplifique Desenvolvimento de Pessoas e NegóciosApresentação Institucional - Simplifique Desenvolvimento de Pessoas e Negócios
Apresentação Institucional - Simplifique Desenvolvimento de Pessoas e Negócios
 
Características de las tics
Características de las ticsCaracterísticas de las tics
Características de las tics
 
Recrutamento & Seleção para Pequenas Empresas
Recrutamento & Seleção para Pequenas EmpresasRecrutamento & Seleção para Pequenas Empresas
Recrutamento & Seleção para Pequenas Empresas
 
【HARES 西村】働き方改革講演資料(17/01/31)
【HARES 西村】働き方改革講演資料(17/01/31)【HARES 西村】働き方改革講演資料(17/01/31)
【HARES 西村】働き方改革講演資料(17/01/31)
 
Урок 10.10. Тепловий баланс
Урок 10.10. Тепловий балансУрок 10.10. Тепловий баланс
Урок 10.10. Тепловий баланс
 
「初心者向けデザイン講座」 -東洋美術学校(第三回目:色編)
「初心者向けデザイン講座」 -東洋美術学校(第三回目:色編)「初心者向けデザイン講座」 -東洋美術学校(第三回目:色編)
「初心者向けデザイン講座」 -東洋美術学校(第三回目:色編)
 
ヒットを企てる人のための構造分析入門
ヒットを企てる人のための構造分析入門ヒットを企てる人のための構造分析入門
ヒットを企てる人のための構造分析入門
 

Semelhante a Puntatori e Riferimenti

Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)STELITANO
 
13 Puntatori E Memoria Dinamica
13   Puntatori E Memoria Dinamica13   Puntatori E Memoria Dinamica
13 Puntatori E Memoria Dinamicaguest60e9511
 
Puntatori in C++
Puntatori in C++Puntatori in C++
Puntatori in C++marckmart
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Marcello Missiroli
 
Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Majong DevJfu
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...UltraUploader
 
Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)STELITANO
 
lezione1.pdf
lezione1.pdflezione1.pdf
lezione1.pdfdttdigi
 
14 - Programmazione: Stream e File
14 - Programmazione: Stream e File14 - Programmazione: Stream e File
14 - Programmazione: Stream e FileMajong DevJfu
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)STELITANO
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)STELITANO
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedefPiero Fraternali
 
Scambio di variabili con puntatori
Scambio di variabili con puntatoriScambio di variabili con puntatori
Scambio di variabili con puntatoriRiccardo Monterisi
 
Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2STELITANO
 

Semelhante a Puntatori e Riferimenti (20)

Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)
 
13 Puntatori E Memoria Dinamica
13   Puntatori E Memoria Dinamica13   Puntatori E Memoria Dinamica
13 Puntatori E Memoria Dinamica
 
Array in C++
Array in C++Array in C++
Array in C++
 
Corso c++
Corso c++Corso c++
Corso c++
 
Puntatori in C++
Puntatori in C++Puntatori in C++
Puntatori in C++
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
 
3 Linguaggioc
3   Linguaggioc3   Linguaggioc
3 Linguaggioc
 
Arduino base
Arduino baseArduino base
Arduino base
 
Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)
 
lezione1.pdf
lezione1.pdflezione1.pdf
lezione1.pdf
 
14 - Programmazione: Stream e File
14 - Programmazione: Stream e File14 - Programmazione: Stream e File
14 - Programmazione: Stream e File
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)
 
Le basi di Pytthon 3 - Fondamenti n.1
Le basi di Pytthon 3 - Fondamenti n.1Le basi di Pytthon 3 - Fondamenti n.1
Le basi di Pytthon 3 - Fondamenti n.1
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedef
 
Scambio di variabili con puntatori
Scambio di variabili con puntatoriScambio di variabili con puntatori
Scambio di variabili con puntatori
 
Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2
 

Mais de Ilio Catallo

C++ Standard Template Library
C++ Standard Template LibraryC++ Standard Template Library
C++ Standard Template LibraryIlio Catallo
 
Regular types in C++
Regular types in C++Regular types in C++
Regular types in C++Ilio Catallo
 
Resource wrappers in C++
Resource wrappers in C++Resource wrappers in C++
Resource wrappers in C++Ilio Catallo
 
Memory management in C++
Memory management in C++Memory management in C++
Memory management in C++Ilio Catallo
 
Operator overloading in C++
Operator overloading in C++Operator overloading in C++
Operator overloading in C++Ilio Catallo
 
Multidimensional arrays in C++
Multidimensional arrays in C++Multidimensional arrays in C++
Multidimensional arrays in C++Ilio Catallo
 
Spring MVC - Wiring the different layers
Spring MVC -  Wiring the different layersSpring MVC -  Wiring the different layers
Spring MVC - Wiring the different layersIlio Catallo
 
Java and Java platforms
Java and Java platformsJava and Java platforms
Java and Java platformsIlio Catallo
 
Spring MVC - Web Forms
Spring MVC  - Web FormsSpring MVC  - Web Forms
Spring MVC - Web FormsIlio Catallo
 
Spring MVC - The Basics
Spring MVC -  The BasicsSpring MVC -  The Basics
Spring MVC - The BasicsIlio Catallo
 
Web application architecture
Web application architectureWeb application architecture
Web application architectureIlio Catallo
 
Introduction To Spring
Introduction To SpringIntroduction To Spring
Introduction To SpringIlio Catallo
 
Java Persistence API
Java Persistence APIJava Persistence API
Java Persistence APIIlio Catallo
 
JSP Standard Tag Library
JSP Standard Tag LibraryJSP Standard Tag Library
JSP Standard Tag LibraryIlio Catallo
 
Internationalization in Jakarta Struts 1.3
Internationalization in Jakarta Struts 1.3Internationalization in Jakarta Struts 1.3
Internationalization in Jakarta Struts 1.3Ilio Catallo
 
Validation in Jakarta Struts 1.3
Validation in Jakarta Struts 1.3Validation in Jakarta Struts 1.3
Validation in Jakarta Struts 1.3Ilio Catallo
 
Introduction to Struts 1.3
Introduction to Struts 1.3Introduction to Struts 1.3
Introduction to Struts 1.3Ilio Catallo
 
Community Detection
Community DetectionCommunity Detection
Community DetectionIlio Catallo
 
WWW12 - The CUbRIK Project
WWW12 - The CUbRIK ProjectWWW12 - The CUbRIK Project
WWW12 - The CUbRIK ProjectIlio Catallo
 

Mais de Ilio Catallo (20)

C++ Standard Template Library
C++ Standard Template LibraryC++ Standard Template Library
C++ Standard Template Library
 
Regular types in C++
Regular types in C++Regular types in C++
Regular types in C++
 
Resource wrappers in C++
Resource wrappers in C++Resource wrappers in C++
Resource wrappers in C++
 
Memory management in C++
Memory management in C++Memory management in C++
Memory management in C++
 
Operator overloading in C++
Operator overloading in C++Operator overloading in C++
Operator overloading in C++
 
Multidimensional arrays in C++
Multidimensional arrays in C++Multidimensional arrays in C++
Multidimensional arrays in C++
 
Arrays in C++
Arrays in C++Arrays in C++
Arrays in C++
 
Spring MVC - Wiring the different layers
Spring MVC -  Wiring the different layersSpring MVC -  Wiring the different layers
Spring MVC - Wiring the different layers
 
Java and Java platforms
Java and Java platformsJava and Java platforms
Java and Java platforms
 
Spring MVC - Web Forms
Spring MVC  - Web FormsSpring MVC  - Web Forms
Spring MVC - Web Forms
 
Spring MVC - The Basics
Spring MVC -  The BasicsSpring MVC -  The Basics
Spring MVC - The Basics
 
Web application architecture
Web application architectureWeb application architecture
Web application architecture
 
Introduction To Spring
Introduction To SpringIntroduction To Spring
Introduction To Spring
 
Java Persistence API
Java Persistence APIJava Persistence API
Java Persistence API
 
JSP Standard Tag Library
JSP Standard Tag LibraryJSP Standard Tag Library
JSP Standard Tag Library
 
Internationalization in Jakarta Struts 1.3
Internationalization in Jakarta Struts 1.3Internationalization in Jakarta Struts 1.3
Internationalization in Jakarta Struts 1.3
 
Validation in Jakarta Struts 1.3
Validation in Jakarta Struts 1.3Validation in Jakarta Struts 1.3
Validation in Jakarta Struts 1.3
 
Introduction to Struts 1.3
Introduction to Struts 1.3Introduction to Struts 1.3
Introduction to Struts 1.3
 
Community Detection
Community DetectionCommunity Detection
Community Detection
 
WWW12 - The CUbRIK Project
WWW12 - The CUbRIK ProjectWWW12 - The CUbRIK Project
WWW12 - The CUbRIK Project
 

Último

lezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldilezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldivaleriodinoia35
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieVincenzoPantalena1
 
XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaXIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaStefano Lariccia
 
Storia dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxStoria dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxOrianaOcchino
 
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaRafael Figueredo
 
Esperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superioreEsperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superiorevaleriodinoia35
 
Corso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativoCorso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativovaleriodinoia35
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaPierLuigi Albini
 
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaXI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaStefano Lariccia
 

Último (9)

lezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldilezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldi
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medie
 
XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaXIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
 
Storia dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxStoria dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptx
 
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
 
Esperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superioreEsperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superiore
 
Corso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativoCorso di digitalizzazione e reti per segretario amministrativo
Corso di digitalizzazione e reti per segretario amministrativo
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza cultura
 
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaXI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
 

Puntatori e Riferimenti

  • 1. Puntatori & Riferimenti Ilio Catallo – info@iliocatallo.it
  • 2. Indice ¤ Il problema dello swap ¤ Puntatori ¤ Reference 2
  • 4. Il problema dello swap ¤ Supponiamo che in un programma avvenga frequentemente lo scambio (swap) tra due interi 4 2 inta: 5 intb:
  • 5. Il problema dello swap ¤ IDEA: Scrivere una funzione int_swap e richiamarla ovunque necessario int main() { ... int a = 2, b = 5; ... int_swap(a, b); // expected result: a = 5, b = 2 } 5
  • 6. Il problema dello swap ¤ Come scrivere int_swap? 6
  • 7. Il problema dello swap ¤ Un possibile tentativo potrebbe essere: ¤ La soluzione sembra immediata…ma funziona? void int_swap(int x, int y) { int temp = x; x = y; y = temp; } 7
  • 9. Il problema dello swap ¤ All’invocazione di int_swap: ¤ I valori di a e b nella funzione chiamante vengono copiati nelle variabili locali x e y ¤ i valori di x e y vengono scambiati, ma… ¤ Le variabili a e b nel chiamante rimangono intoccate ... int a = 2, b = 5; int_swap(a, b); // x and y are copies of a and b, // hence a and b remain unchanged 9
  • 10. Il problema dello swap ¤ Non è possibile scrivere la funzione int_swap passando le variabili per copia 10 #@?$!
  • 12. Organizzazione della memoria ¤ La memoria può essere immaginata come una successione di celle di memoria ¤ Ogni cella occupa la minima dimensione che il calcolatore è in grado di gestire (1 byte*) *1 byte è il quantitativo più comune 12
  • 13. Organizzazione della memoria ¤ Ad ogni cella è associato un indirizzo crescente 13
  • 14. Organizzazione della memoria ¤ L’indirizzo di una cella è pari a quella della precedente più uno 14
  • 15. Organizzazione della memoria ¤ In questo modo: ¤ Ogni cella ha un indirizzo univoco ¤ È nota una regola per passare da una cella alle successive 15
  • 16. Nome di una variabile ¤ Il nome della variabile è lo strumento usato per accedere al contenuto della memoria riservata a tale variabile int a = 5; int b = a + 5; // we use the data contained in ‘a’ // without knowing its physical // location in memory 16
  • 17. Variabili e memoria ¤ In virtù del fatto che ogni variabile ha un nome, non dobbiamo solitamente preoccuparci di dove i dati vengano memorizzati 17 1775 17771776 1778 1779 1780 int a
  • 18. Variabili e memoria ¤ Ciononostante, una variabile occupa una o più celle di memoria 18 1775 17771776 1778 1779 1780 int a
  • 19. Indirizzo di una variabile ¤ Quando vogliamo riferirci all’indirizzo di una variabile, piuttosto che il suo valore, utilizziamo la sintassi &nome_variabile 19 1775 17771776 1778 1779 1780 int a&a
  • 20. Indirizzo di una variabile ¤ L’espressione &a può essere letta come “indirizzo di a” 20 1775 17771776 1778 1779 1780 int a&a
  • 21. Indirizzo di una variabile ¤ Data dunque la definizione: ¤ Si ha che: ¤ a si riferisce al contenuto della variabile (5 in questo caso) ¤ &a si riferisce all’indirizzo dove tale contenuto risiede in memoria 21 int a = 5;
  • 22. Indirizzo di una variabile ¤ Esempio: stampare a video l’indirizzo di una variabile 22 int a = 5; std::cout << "the address of a is " << &a << std::endl;
  • 23. Indirizzo di una variabile ¤ Quando il simbolo & precede un’espressione, questo assume il ruolo di operatore (address-of operator) 23 int a = 5; std::cout << "the address of a is " << &a << std::endl;
  • 24. Indirizzo di una variabile ¤ Nota: se una variabile occupa più di una cella di memoria, l’operatore & restituisce l’indirizzo della prima cella di memoria utilizzata 1775 17771776 1778 1779 1780 int a&a 24
  • 25. Dimensione dei tipi dati in C++ ¤ Non esistono dimensioni prefissate dei tipi dati ¤ La dimensione in byte di ogni tipo dato è dipendente dall’architettura del calcolatore e dal compilatore ¤ Lo standard C++ specifica unicamente il minimo intervallo di valori memorizzabili 25
  • 26. Dimensione dei tipi dati in C++ ¤ Esempio: un int deve permettere di memorizzare numeri interi tra -32’767 e +32’767 ¤ Tipica dimensione su architettura Intel 16-bit: 2 byte ¤ Tipica dimensione su architettura Intel 32-bit: 4 byte 26
  • 27. Memorizzare un indirizzo ¤ La stampa di un indirizzo non è particolarmente utile ¤ Supponiamo invece di voler memorizzare l’indirizzo di a, in modo da poterlo riutilizzare successivamente ¤ Abbiamo bisogno di una variabile address_of_a il cui contenuto sia l’indirizzo di a int a = 5; std::cout << "the address of a is " << &a << std::endl; 27
  • 28. Memorizzare un indirizzo ? address_of_a = &a; &aaddress_of_a:5a: int ? 28
  • 29. Memorizzare un indirizzo ¤ La variabile address_of_a deve contenere “l’indirizzo di una variabile di tipo int” 29 ? address_of_a = &a;
  • 30. Memorizzare un indirizzo ¤ Qual è il tipo dato di address_of_a? 30 ? address_of_a = &a;
  • 31. Memorizzare un indirizzo ¤ Il tipo dato di una variabile che contiene l’indirizzo di un intero è int* ¤ Il tipo dato int* si chiama puntatore a intero int* address_of_a = &a; 31
  • 32. Puntatori ¤ Variabili che contengono indirizzi sono chiamate puntatori ¤ Una variable di tipo T* può contenere l’indirizzo di una variabile di tipo T ¤ È possibile creare puntatori a qualsiasi tipo dato*, indipendentemente che questo sia predefinito o creato dall’utente Per un tipo dato T, T* è il tipo dato puntatore a T * Purchè il tipo dato non sia più piccolo di 1 byte 32
  • 33. Esempi di puntatori ¤ Regola (del pollice) per interpretare il tipo dato: ¤ Il più a destra degli asterischi * si legge “puntatore a…” ¤ Tutto ciò che segue da destra a sinistra è il tipo puntato int* a; // pointer to int char* b; // pointer to char float* c; // pointer to float int** d; // pointer to pointer to int Per un tipo dato T, T* è il tipo dato puntatore a T 33
  • 35. Accedere al contenuto di una variabile ¤ Supponiamo che qualcuno ci fornisca un puntatore a intero ptr contenente l’indirizzo di una variabile intera 35 int* ptr = ... // somehow initialized
  • 36. Accedere al contenuto di una variabile ¤ Possiamo usare l’indirizzo memorizzato in ptr per accedere al contenuto della variabile puntata? 36 int* ptr = ... // somehow initialized
  • 37. Indirezione ¤ Dato un puntatore, è possibile accedere al contenuto della variabile puntata attraverso l’operatore * (indirection operator) int* ptr = ... // somehow initialized std::cout << "the value of the variable pointed to by ptr is " << *ptr << std::endl; 37
  • 38. Indirezione ¤ L’espressione *ptr può essere letta come “il valore della variabile puntata da ptr” int* ptr = ... // somehow initialized std::cout << "the value of the variable pointed to by ptr is " << *ptr << std::endl; 38
  • 39. Indirezione ¤ L’operatore di indirezione può essere usato sia per leggere che per modificare il valore della variabile puntata int* ptr = ... // somehow initialized *ptr = 7; int b = 5 + *ptr; // b contains 12 39
  • 40. Indirezione ¤ In altre parole, l’espressione *ptr può apparire a sinistra dell’operatore di assegnamento 40 int* ptr = ... // somehow initialized *ptr = 7; int b = 5 + *ptr; // b contains 12
  • 43. Metodi d’accesso ¤ È possibile quindi accedere al contenuto di una variabile in due modi: ¤ Attraverso il suo nome ¤ Attraverso il suo indirizzo (memorizzato in un puntatore) ¤ L’accesso mediante puntatore è indiretto ¤ per accedere al contenuto della variabile puntata è necessario prima accedere al contenuto del puntatore 43
  • 44. Puntatori nulli ¤ Come per tutte le variabili locali, non è possibile conoscere il valore di un puntatore non inizializzato 44 int* ptr; // uninitialized pointer
  • 45. Puntatori nulli ¤ Il puntatore potrebbero contenere un qualsiasi valore 45 int* ptr; // uninitialized pointer
  • 46. Puntatori nulli ¤ Tale valore casuale potrebbe essere interpretato come l’indirizzo di un ipotetica variabile puntata dal puntatore 46 int* ptr; // uninitialized pointer
  • 47. Puntatori nulli ¤ Non esiste alcun modo di capire se il valore contenuto in un puntatore rappresenti o meno un indirizzo valido 47 int* ptr; // uninitialized pointer
  • 48. Puntatori nulli ¤ È molto facile trovarsi ad utilizzare un puntatore non inizializzato senza nemmeno rendersene conto 48 int* ptr; // uninitialized pointer
  • 49. Puntatori nulli ¤ Per evitare il rischio di avere puntatori non inizializzati sarebbe sufficiente inizializzare un puntatore solo dopo aver definito la variabile da puntare 49 int a = 5; int* ptr = &a;
  • 50. Puntatori nulli ¤ Purtroppo, ciò non è sempre realizzabile ¤ in alcuni casi non è effettivamente possibile creare la variabile da puntare prima dell’inizializzazione del puntatore ¤ Anche senza una variabile da puntare, sarebbe preferibile evitare rischi inizializzando il puntatore. 50
  • 51. Puntatori nulli ¤ È possibile inizializzare un puntatore e al contempo indicare che non è ancora disponibile la corrispettiva variabile a cui puntare ¤ Per farlo si inizializza il puntatore al valore: ¤ NULL (fino al C++03) o ¤ nullptr (dal C++11) 51
  • 52. Puntatori nulli ¤ L’espressione può essere letta come “il puntatore ptr non punta a nulla” int* ptr = nullptr; // 'ptr’ is not // pointing to anything 52
  • 53. Il problema dello swap: soluzione ¤ Come possiamo usare i puntatori per riuscire a scrivere la funzione int_swap? 53
  • 54. Il problema dello swap: soluzione ¤ IDEA: invece di passare una copia del contenuto delle variabili, passare una copia del loro indirizzo void int_swap(int* x, int* y) { int temp = *x; *x = *y; *y = temp; } 54
  • 55. Il problema dello swap: soluzione ¤ All’invocazione di int_swap: ¤ Gli indirizzi di a e b nella funzione chiamante vengono copiati nelle variabili puntatore locali x e y ¤ Si scambiano i valori delle variabili puntate da x e y (ovvero a e b) ¤ Al termine della funzione int_swap le variabili locali x e y vengono distrutte ¤ Come invocare la nuova funzione int_swap? 55
  • 56. Il problema dello swap: soluzione ¤ Sappiamo che: ¤ La funzione int_swap si aspetta in ingresso gli indirizzi delle variabili da scambiare ¤ Per ottenere l’indirizzo di una variabile si usa l’operatore & 56
  • 57. Il problema dello swap: soluzione ¤ Se vogliamo scambiare il contenuto di a e b dobbiamo quindi fornire l’indirizzo di a (&a) e l’indirizzo di b (&b) int main() { ... int a = 2, b = 5; ... int_swap(&a, &b); // now: a = 5, b = 2 } 57
  • 58. Passaggio per indirizzo ¤ Se una funzione riceve una copia delll’indirizzo di una variabile piuttosto che un copia del suo valore, si parla di passaggio per indirizzo ¤ Il passaggio per indirizzo permette di: ¤ Riflettere le modifiche attutate nella funziona chiamata anche alla funzione chiamante ¤ Accedere rapidamente a dati corposi, dato che nessuna copia del dato viene creata ¤ Simulare il ritorno di più variabili da una funzione 58
  • 59. Problema risolto? ¤ Siamo soddisfatti della nostra soluzione? ¤ Il metodo funziona, ma… ¤ Il codice è diventato difficile da leggere ¤ dovremmo gestire il caso di particolare in cui viene passato nullptr come indirizzo ¤ Possiamo fare di meglio? int_swap(&a, &b); 59
  • 61. Inizializzare una variabile ¤ Al momento dell’inizializzazione di una variabile, il valore della variabile inizializzatrice viene copiato nella nuova variabile ¤ Al termine dell’inizializzazione, ognuna delle due variabili contiene la propria copia dello stesso valore ¤ La nuova variabile vive una vita indipendente, il cambiamento del suo valore non altera quello della variabile inizializzatrice 61
  • 62. Dichiarare una variabile ¤ Quando una variabile viene dichiarata, se ne specifica il tipo e l’identificativo (nome) ¤ Entrambi questi aspetti non sono modificabili in un secondo momento ¤ Non è possibile tramutare una variabile di tipo T in una variabile di tipo T’* ¤ Non è possibile mutare l’identificativo (cambiare nome ad una variabile) * ricorda che il casting crea una nuova variabile, non cambia la natura di una variabile esistente 62
  • 63. Alias di una variabile ¤ Il C++ permette però di inizializzare nomi aggiuntivi (alias) per una variabile: int a = 5; int& b = a; // b is a new name (alias) for a 63
  • 64. Alias di una variabile ¤ b non indica una nuova area di memoria, b è solo un altro nome per a int a = 5; int& b = a; // b is a new name (alias) for a 64
  • 65. Alias di una variabile ¤ b è una variabile di tipo int&, ovvero un alias di una variabile di tipo int int a = 5; int& b = a; // b is a new name (alias) for a 65
  • 66. Riferimenti ¤ Gli alias di una variabile sono chiamati riferimenti (reference*) ¤ L’inizializzazione di un riferimento non comporta la copia del valore della variabile inizializzatrice, bensì l’associazione (binding) del nuovo nome alla variabile * Dal C++11 sono stati rinominati lvalue reference Per un tipo dato T, T& è il tipo dato riferimento a T 66
  • 67. Esempi di riferimenti ¤ Regola (del pollice) per interpretare il tipo dato: ¤ L’ampersand & più a destra si legge “riferimento a…” ¤ Tutto ciò che segue da destra a sinistra è il tipo a cui ci si riferisce Per un tipo dato T, T& è il tipo dato riferimento a T int& a = b; // a is a new name for b (where b is of type int) float& c = d; // c is a new name for d (where d is of type float) int& e = b; // e is a new name for b, hence a new name for a int*& f = g; // f is a new name for g (where g is of type int*) 67
  • 68. Nuovo vs. vecchio nome ¤ Una volta inizializzato, usare il nuovo nome o il vecchio nome è indifferente* int a = 5; int& b = a; // b is a new name (alias) for a b = 7; std::cout << a << std::endl; // the output will be '7' std::cout << &a << &b << std::endl; //'a' and 'b' are the same thing, // so the address is the same * concetto riassumibile nella massima: “the reference is the referent” 68
  • 69. Limitazione dei riferimenti ¤ I riferimenti devono essere inizializzati ¤ I riferimenti non possono essere ri-assegnati: ¤ Non sono ammessi* riferimenti a riferimenti int& b; //ERROR: b is a new name of which variable? int a = 5, c = 10; int& b = a; b = c; // this does not mean that b is now a // new name for c, the expression amounts to // say “a = c” * Dal C++11, esiste un unico strappo alla regola al fine di permettere il perfect forwarding 69
  • 70. Il problema dello swap: soluzione ¤ I riferimenti ci permettono di scrivere la funzione int_swap in maniera semplice e sicura void swap(int& x, int& y) { int temp = x; x = y; y = temp; } Il corpo della funzione è uguale a quanto scritto nella prima (errata) versione 70
  • 71. Il problema dello swap: soluzione ¤ I riferimenti ci permettono di scrivere la funzione int_swap in maniera semplice e sicura: ¤ Semplice: non dobbiamo usare l’operatore di indirezione ovunque ¤ Sicura: non possiamo per errore passare nullptr 71
  • 72. Il problema dello swap: soluzione ¤ Per scambiare i valori di a e b, invochiamo la funzione int_swap esattamente come una qualsiasi altra funzione 72 int main() { ... int a = 2, b = 5; ... int_swap(a, b); // now: a = 5, b = 2 }
  • 73. Il problema dello swap: soluzione ¤ In questo modo: ¤ x è un alias per a ¤ y è un alias per b int main() { ... int a = 2, b = 5; ... int_swap(a, b); // now: a = 5, b = 2 } 73
  • 74. Il problema dello swap: soluzione ¤ Modificare x e y è la stessa cosa che modificare a e b 74 int main() { ... int a = 2, b = 5; ... int_swap(a, b); // now: a = 5, b = 2 }
  • 76. Bibliografia ¤ S. B. Lippman, J. Lajoie, B. E. Moo, C++ Primer (5th Ed.) ¤ B. Stroustrup, The C++ Programming Language (4th Ed.) ¤ R. Lafore, Object Oriented Programming in C++ (4th Ed.) ¤ C++FAQ, Section 8 http://www.parashift.com/c++-faq/references.html 76