02 CPP Dati W
02 CPP Dati W
// char
◆char
char c=‘y’; // inizializzazione
◆int
// Literals
◆float
10 // 10 int
◆Reference
Programmazione C++ 2
Tipi di dati
Built-in semplici: modificatori
◆unsigned
unsigned int ui;
◆long short s;
◆short
⚫ Riduce la precisione del tipo int
⚫ Può essere usato al posto di short int
Programmazione C++ 3
Tipi di dati
Built-in semplici – Range e dimensioni (1)
◆Il file <limits> contiene le caratteristiche dei dati riferiti alla piattaforma
HW/SW utilizzata
Programmazione C++ 4
Tipi di dati
Built-in semplici – Range e dimensioni (2)
Programmazione C++ 5
Tipi di dati
Puntatori (1)
◆Puntatore
⚫ Riferimento ad un indirizzo (accesso indiretto ad un dato)
⚫ Contiene l’indirizzo dove trovare un dato di un certo tipo
tipo *nome_variabile;
Programmazione C++ 6
Tipi di dati
Puntatori (1)
◆Puntatore
⚫ Riferimento ad un indirizzo (accesso indiretto ad un dato)
⚫ Contiene l’indirizzo dove trovare un dato di un certo tipo
tipo *nome_variabile;
Programmazione C++ 7
Tipi di dati
Puntatori (1)
◆Puntatore
⚫ Riferimento ad un indirizzo (accesso indiretto ad un dato)
⚫ Contiene l’indirizzo dove trovare un dato di un certo tipo
0:
tipo *nome_variabile;
Programmazione C++ 8
Tipi di dati
Puntatori (1)
◆Puntatore
⚫ Riferimento ad un indirizzo (accesso indiretto ad un dato)
⚫ Contiene l’indirizzo dove trovare un dato di un certo tipo
0:
tipo *nome_variabile;
XYZ: intero
3 int intero = 123;
123
Programmazione C++ 9
Tipi di dati
Puntatori (1)
◆Puntatore
⚫ Riferimento ad un indirizzo (accesso indiretto ad un dato)
⚫ Contiene l’indirizzo dove trovare un dato di un certo tipo
0:
tipo *nome_variabile;
XYZ: intero
3 int intero = 123;
123
4 int *ptr = &intero; // &var = indirizzo di var
ptr XYZ:
Programmazione C++ 10
Tipi di dati
Puntatori (1)
◆Puntatore
⚫ Riferimento ad un indirizzo (accesso indiretto ad un dato)
⚫ Contiene l’indirizzo dove trovare un dato di un certo tipo
0:
tipo *nome_variabile;
XYZ: intero
3 int intero = 123;
123
4 int *ptr = &intero; // &var = indirizzo di var
*ptr
ptr XYZ:
Programmazione C++ 11
Tipi di dati
Puntatori (1)
◆Puntatore
⚫ Riferimento ad un indirizzo (accesso indiretto ad un dato)
⚫ Contiene l’indirizzo dove trovare un dato di un certo tipo
0:
tipo *nome_variabile;
XYZ: intero
3 int intero = 123;
124
4 int *ptr = &intero; // &var = indirizzo di var
*ptr
6 (*ptr)++; // intero=124;
ptr XYZ:
Programmazione C++ 12
Tipi di dati
Puntatori (2)
XYZ: intero
123
Programmazione C++ 13
Tipi di dati
Puntatori (2)
XYZ: intero
123
ptr1 XYZ:
Programmazione C++ 14
Tipi di dati
Puntatori (2)
XYZ: intero
123
ptr2 XYZ:
ptr1 XYZ:
Programmazione C++ 15
Tipi di dati
Puntatori (2)
XYZ: intero
123
ptr2 XYZ:
ptr3 XYZ:
ptr1 XYZ:
Programmazione C++ 16
Tipi di dati
Puntatori (2)
5 *ptr3 = 999;
XYZ: intero
123
999
ptr2 XYZ:
ptr3 XYZ:
ptr1 XYZ:
Programmazione C++ 17
Tipi di dati
Puntatori (3)
XYZ: intero
123
XYZ
ptr
:
ptr2 XYZ:+2*sizeof(int)
Programmazione C++ 18
Tipi di dati
Puntatori (4)
123
XYZ
ptr
:
Programmazione C++ 19
Tipi di dati
Puntatori (5)
◆ T *p;
⚫ Tramite il puntatore, tratto la memoria come se fosse fatta solo di oggetti di tipo T
int intero=123;
int *ptr=&intero;
Programmazione C++ 20
Tipi di dati
Puntatori (5)
◆ T *p;
⚫ Tramite il puntatore, tratto la memoria come se fosse fatta solo di oggetti di tipo T
int intero=123;
int *ptr=&intero;
Memoria
Programmazione C++ 21
Tipi di dati
Puntatori (6)
Segmentation Fault
P1
Access Violation
Locazione P2
non valida
P3
Programmazione C++ 22
Tipi di dati
Puntatori (7)
3 p1--; // Ok
4 p1+p2; // Errore
6 p1=p2;
p1=NULL; // Riassegnabilità
7 double d;
Programmazione C++ 23
Tipi di dati
Puntatori (8)
5 p = &i; // p punta a i
6 q = &p; // q punta a p
AEO: q XYZ:
7 r = &q; // r punta a q
r AEO:
Programmazione C++ 24
Tipi di dati
Puntatori (9)
int i;
double d;
3 pvi++; // Errore
4 *pvi; // Errore
Programmazione C++ 25
Tipi di dati
Puntatori (10)
Programmazione C++ 26
Tipi di dati
Puntatori (11)
◆Confrontare due puntatori (dello stesso tipo) significa confrontare gli indirizzi
che contengono, NON l’oggetto puntato!
Programmazione C++ 27
Tipi di dati
Array (1)
tipo nome_variabile[nn];
7 array3[0] = ‘a’; // Ok
Programmazione C++ 28
Tipi di dati
Array (2)
◆Array Multidimensionali
tipo nome_variabile[nn][mm];
1 int array[2][3];
3 int v = array[1][2];
array
Programmazione C++ 29
Tipi di dati
Array (3)
◆Array e puntatori
array
Programmazione C++ 30
Tipi di dati
Array (3)
◆Array e puntatori
int *p;
2 p = array; // il nome dell’array ‘decade’ automaticamente
// in un puntatore ( = &(array[0]) )
array
Programmazione C++ 31
Tipi di dati
Array (3)
◆Array e puntatori
3 int *q = array+2; // Ok
[0] [1] [2]
array
Programmazione C++ 32
Tipi di dati
Array (3)
◆Array e puntatori
3 int *q = array+2; // Ok
[0] [1] [2]
4 array++; // Errore
array
Programmazione C++ 33
Tipi di dati
Array (3)
◆Array e puntatori
3 int *q = array+2; // Ok
[0] [1] [2]
4 array++; // Errore
array
5 p++; // Ok
Programmazione C++ 34
Tipi di dati
Array (3)
◆Array e puntatori
3 int *q = array+2; // Ok
[0] [1] [2]
4 array++; // Errore
array
5 p++; // Ok
6 int v = array[1]; // == -2
Programmazione C++ 35
Tipi di dati
Array (4)
◆Array e puntatori
array
Programmazione C++ 36
Tipi di dati
Array (4)
◆Array e puntatori
array
Programmazione C++ 37
Tipi di dati
Array (4)
◆Array e puntatori
array
Programmazione C++ 38
Tipi di dati
Array (4)
◆Array e puntatori
5 p++; array
6 (*p)[1]=10; // == array[1][1]=10;
p
Programmazione C++ 39
Tipi di dati
Array (5)
◆Array e puntatori
r
p [0] [1]
[2]
Tipo &nome_variabile=altra_variabile;
Programmazione C++ 42
Tipi di dati
Puntatori e Reference
Programmazione C++ 43
Tipi di dati
Puntatori e Reference
Programmazione C++ 44
Tipi di dati
Puntatori e Reference
Programmazione C++ 45
Tipi di dati
Tipi Compositi : struct (1)
struct Punto
◆Raggruppa diversi tipi {
int x;
int y;
struct nome_tipo { }; // Ricordarsi ; !!
*ppt = pt;
Programmazione C++ 46
Tipi di dati
Tipi Compositi : struct (2)
struct S1
{
char c1;
int i1;
char c2;
};
Programmazione C++ 47
Tipi di dati
Tipi Compositi : struct (2)
struct S1
{
char c1;
int i1;
char c2;
};
// sizeof(S1)=12
Programmazione C++ 48
Tipi di dati
Tipi Compositi : struct (2)
struct S1 struct S2
{ {
char c1; char c1;
int i1; char c2;
char c2; int i1;
}; };
// sizeof(S1)=12
Programmazione C++ 49
Tipi di dati
Tipi Compositi : struct (2)
struct S1 struct S2
{ {
char c1; char c1;
int i1; char c2;
char c2; int i1;
}; };
// sizeof(S1)=12 // sizeof(S2)=8
⚫ Il compilatore struttura la memoria per una lettura efficiente dei dati (Allineamento dei
byte)
Programmazione C++ 50
Tipi di dati
Tipi Compositi : struct (3)
◆ Inizializzazione
struct S
{
int i;
double d;
char carray[10];
};
S s1={10,1.34,”PIPPO”};
S s2[2]={
{ 1, 3.14, ”PLUTO”}, // Completa
{ -986, 1.112345} // Parziale
};
Programmazione C++ 51
Tipi di dati
enum
2 giorno g;
g = 90; // Errore: Invalid conversion from int to giorni
g = sab; // Ok
int d = lun; // Ok
Programmazione C++ 52
Tipi di dati
Nuovi nomi: typedef
uli i;
3 ptr_uli p = &i;
Programmazione C++ 53
Tipi di dati
Modificatore “const” (1)
⚫ Immodificabilità
⚫ Necessaria inizializzazione
▪ E’ sempre possibile inizializzare una variabile const con una variabile (dello stesso tipo) non const
3 ci=0; // Errore
int i=0;
4 const int &rci=i; // Ok
5 rci++; // Errore
Programmazione C++ 54
Tipi di dati
Modificatore “const” (2)
Programmazione C++ 55
Tipi di dati
Modificatore “const” (2)
int *const p;
Programmazione C++ 56
Tipi di dati
Modificatore “const” (2)
*p = 100; // Errore
p = 0; // Ok
int *const p;
Programmazione C++ 57
Tipi di dati
Modificatore “const” (2)
*p = 100; // Errore
p = 0; // Ok
*p = 100; // Ok
p = 0; // Errore
Programmazione C++ 58
Tipi di dati
Modificatore “const” (2)
*p = 100; // Errore
p = 0; // Ok
*p = 100; // Ok
p = 0; // Errore
*p = 100; // Errore
p = 0; // Errore
Programmazione C++ 59
Tipi di dati
Le stringhe (1)
char strl[]={‘G’,’i’,’o’,’r’,’n’,’a’,’t’,’a’,’\0’};
Programmazione C++ 60
Tipi di dati
Le stringhe (2)
char strl[]={‘G’,’i’,’o’,’r’,’n’,’a’,’t’,’a’,’\0’};
B u o n a \0 % $ ? #
strc
strl G i o r n a t a \0
C i a o \0
Programmazione C++ 61
Tipi di dati
Le stringhe (3)
std::string s1;
std::string s2=“pippo”;
s1=“pluto”;
s1[0]=‘B’;
Programmazione C++ 62
Definizioni e Dichiarazioni
Funzione Main ver. 2
...
Programmazione C++ 63
Definizioni e Dichiarazioni
Funzione Main ver. 2
\0 argv[0]
\0 argv[1]
\0 argv[2]
argv ...
Programmazione C++ 64
Definizioni e Dichiarazioni
Funzione Main ver. 2
for(int i=1;i<argc;i++)
cout<<“Parametro [“<<i<<“] : ”<<argv[i]<<endl;
return 0;
}
Programmazione C++ 65
Cast a tipo
◆Implicito
varTipo1 = varTipo2
◆Esplicito C
varTipo1 = (Tipo1)varTipo2
◆Esplicito C++
varTipo1 = static_cast<Tipo1>(varTipo2)
varTipo1 = const_cast<Tipo1>(varTipo2)
varTipo1 = reinterpret_cast<Tipo1>(varTipo2)
varTipo1 = dynamic_cast<Tipo1>(varTipo2)
Programmazione C++ 66
Cast a tipo
Esempi
1 int i;
double d;
2 int *pi;
const int *cpi = &i;
3 char *c;
Programmazione C++ 67