Il 0% ha trovato utile questo documento (0 voti)
3 visualizzazioni

02 CPP Dati W

Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
3 visualizzazioni

02 CPP Dati W

Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 67

Programmazione C++

Gianluigi Ciocca, Luigi Celona


Tipi di dati
Built-in semplici

◆bool int i, j; // senza inizializzazione

// char
◆char
char c=‘y’; // inizializzazione
◆int
// Literals
◆float
10 // 10 int

◆double 10.5 // 10.5 double

10.5f // 10.5 float

0x0120 // esadecimale (288)


◆Puntatore

◆Reference

Programmazione C++ 2
Tipi di dati
Built-in semplici: modificatori

◆unsigned
unsigned int ui;

unsigned char c=-1;


⚫ Elimina il segno dai tipi char, int
long int li;

short int si;

◆long short s;

⚫ Estende la precisione dei tipi int e double // Literals

⚫ Può essere usato al posto di long int 10l // 10 long int

◆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)

◆Range e dimensioni dipendono dalla piattaforma HW/SW

◆Nello standard C++ sono comunque definiti dei vincoli


⚫ char è la più piccola entità indirizzabile dalla piattaforma HW/SW
▪ E’ garantito avere dimensione di almeno 8 bit

⚫ int è garantito avere dimensione di almeno 16 bit


⚫ long è garantito avere dimensione di almeno 32 bit

◆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)

◆ sizeof(), ritorna la dimensione di un tipo (o variabile) come multiplo della


dimensione di un char
⚫ Esempi
▪ sizeof(char) = 1
▪ sizeof(int) = 4
▪ sizeof(double) = 8

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;

1 int *p; // senza inizializzazione


p ???

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;

1 int *p; // senza inizializzazione 0


p ???
2 int *p = 0; // o =NULL definito in <stdlib.h>

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;

1 int *p; // senza inizializzazione 0


p ???
2 int *p = 0; // o =NULL definito in <stdlib.h>

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;

1 int *p; // senza inizializzazione 0


p ???
2 int *p = 0; // o =NULL definito in <stdlib.h>

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;

1 int *p; // senza inizializzazione 0


p ???
2 int *p = 0; // o =NULL definito in <stdlib.h>

XYZ: intero
3 int intero = 123;
123
4 int *ptr = &intero; // &var = indirizzo di var
*ptr

5 int v = *ptr; // dereferenziamento ( v=123 )

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;

1 int *p; // senza inizializzazione 0


p ???
2 int *p = 0; // o =NULL definito in <stdlib.h>

XYZ: intero
3 int intero = 123;
124
4 int *ptr = &intero; // &var = indirizzo di var
*ptr

5 int v = *ptr; // dereferenziamento ( v=123 )

6 (*ptr)++; // intero=124;

ptr XYZ:

Programmazione C++ 12
Tipi di dati
Puntatori (2)

◆Più puntatori possono puntare allo stesso dato

1 int intero = 123;

XYZ: intero

123

Programmazione C++ 13
Tipi di dati
Puntatori (2)

◆Più puntatori possono puntare allo stesso dato

1 int intero = 123;

2 int *ptr1 = &intero;

XYZ: intero

123

ptr1 XYZ:

Programmazione C++ 14
Tipi di dati
Puntatori (2)

◆Più puntatori possono puntare allo stesso dato

1 int intero = 123;

2 int *ptr1 = &intero;

3 int *ptr2 = &intero;

XYZ: intero

123

ptr2 XYZ:

ptr1 XYZ:

Programmazione C++ 15
Tipi di dati
Puntatori (2)

◆Più puntatori possono puntare allo stesso dato

1 int intero = 123;

2 int *ptr1 = &intero;

3 int *ptr2 = &intero;

4 int *ptr3 = ptr2;

XYZ: intero

123

ptr2 XYZ:
ptr3 XYZ:
ptr1 XYZ:

Programmazione C++ 16
Tipi di dati
Puntatori (2)

◆Più puntatori possono puntare allo stesso dato

1 int intero = 123;

2 int *ptr1 = &intero;

3 int *ptr2 = &intero;

4 int *ptr3 = ptr2;

5 *ptr3 = 999;

XYZ: intero

123
999

ptr2 XYZ:
ptr3 XYZ:
ptr1 XYZ:

Programmazione C++ 17
Tipi di dati
Puntatori (3)

◆Aritmetica dei puntatori


int intero = 123;

int *ptr = &intero;


⚫ Somma e sottrazione di numeri interi
int *ptr2 = (ptr+2);

◆Se ptr è un puntatore a interi


⚫ (ptr+N) è un nuovo puntatore che punta
▪ All’N-esimo intero dopo quello puntato da ptr, cioè
▪ l’indirizzo in (ptr+N) è quello in ptr + la dimensione di N interi

XYZ: intero

123

XYZ
ptr
:
ptr2 XYZ:+2*sizeof(int)

Programmazione C++ 18
Tipi di dati
Puntatori (4)

◆Aritmetica dei puntatori


⚫ Accesso all’i-esimo elemento puntato

◆Se ptr è un puntatore a interi


⚫ ptr[N] è il valore puntato da (ptr+N), cioè *(ptr+N)

XYZ: intero ptr[2]

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;

int *ptr2=ptr+200000; // Attenzione!!!!

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;

int *ptr2=ptr+200000; // Attenzione!!!!

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)

1 int *p1, p2; // p2 non è un puntatore

2 int *p1, *p2; // p1 e p2 puntatori

3 p1--; // Ok

4 p1+p2; // Errore

5 p2-p1; // Ok (numero di elementi di tipo T tra p2 e p1)

6 p1=p2;
p1=NULL; // Riassegnabilità

7 double d;

int *pi=&d; // Errore

Programmazione C++ 23
Tipi di dati
Puntatori (8)

1 int *p; // Puntatore a interi


PQR: i 10
2 int **q; // Puntatore a puntatore a interi

3 int ***r; // Puntatore a puntatore a puntatore a interi

4 int i = 10; XYZ: p PQR:

5 p = &i; // p punta a i

6 q = &p; // q punta a p
AEO: q XYZ:
7 r = &q; // r punta a q

8 ***r = 90; // i=90 (*r==q, **r==*q==p, ***r==**q==*p==i)

r AEO:

Programmazione C++ 24
Tipi di dati
Puntatori (9)

◆Puntatore a void (da evitare!)

int i;

double d;

1 void *pvi = &i; // Ok

2 void *pvd = &d; // Ok

3 pvi++; // Errore

4 *pvi; // Errore

5 *((int*)(pvi)); // Ok cast + dererefenziamento

6 *((int*)(pvd)); // Ok cast + dereferenziamento ATTENZIONE!!!!

Programmazione C++ 25
Tipi di dati
Puntatori (10)

◆Perchè sono utili?


⚫ Permettono di riferirsi a diversi dati (dello stesso tipo)
⚫ Permettono la condivisione di uno stesso dato
⚫ Consentono una gestione più efficiente della memoria (es. passaggio dei parametri a
funzioni)
⚫ Per allocare (dinamicamente) memoria nello heap (o free store) bisogna utilizzare i
puntatori
⚫ Consentono di costruire strutture di dati dinamiche (liste, alberi,…)

◆In JAVA i riferimenti agli oggetti SONO puntatori nascosti


⚫ Hanno però un comportamento diverso da quelli C++

Programmazione C++ 26
Tipi di dati
Puntatori (11)

◆La dimensione di un puntatore è quella necessaria per contenere un indirizzo


sizeof(int) = 4
sizeof(double) = 8
sizeof(int *) = 4
sizeof(double *) = 4

◆Confrontare due puntatori (dello stesso tipo) significa confrontare gli indirizzi
che contengono, NON l’oggetto puntato!

int v1 = 10, v2 = 10;


int *p1 = &v1, *p2 = &v2, *p3 = p2;

bool b1 = (p1==p2); // false

bool b3 = (*p1 == *p2); // true

bool b2 = (p2==p3); // true

Programmazione C++ 27
Tipi di dati
Array (1)

◆E’ una sequenza contigua di elementi

tipo nome_variabile[nn];

1 char array1[3]; // non inizializzato

2 char array2[3] = {‘a’,’b’,’c’}; // inizializzazione

3 char array3[3] = {‘d’,‘e’}; // inizializzazione parziale


[0] [1] [2]
4 int array4[] = {1,2,3,4,5}; // dimensione automatica
array
5 array1 = array2; // Errore

6 array2 = {‘p’,‘q’,’r’}; // Errore

7 array3[0] = ‘a’; // Ok

8 char v = array2[2]; // v=‘c’

9 char w = array2[10]; // Attenzione !!!

Programmazione C++ 28
Tipi di dati
Array (2)

◆Array Multidimensionali

tipo nome_variabile[nn][mm];

1 int array[2][3];

2 int array[2][3] = {{1,2,3},{4,5,6}};

3 int v = array[1][2];

// La prima dimensione (e solo quella) può


essere fatta calcolare dal compilatore
4 int array2[][3] = {{1,2,3},{4,5,6},{7,8,9}};

[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]

array

Programmazione C++ 29
Tipi di dati
Array (3)

◆Array e puntatori

1 int array[3] = {-1,-2,-3};

[0] [1] [2]

array

Programmazione C++ 30
Tipi di dati
Array (3)

◆Array e puntatori

1 int array[3] = {-1,-2,-3};

int *p;
2 p = array; // il nome dell’array ‘decade’ automaticamente
// in un puntatore ( = &(array[0]) )

[0] [1] [2]

array

Programmazione C++ 31
Tipi di dati
Array (3)

◆Array e puntatori

1 int array[3] = {-1,-2,-3};


q
int *p;
2 p = array; // il nome dell’array ‘decade’ automaticamente
// in un puntatore ( = &(array[0]) )

3 int *q = array+2; // Ok
[0] [1] [2]

array

Programmazione C++ 32
Tipi di dati
Array (3)

◆Array e puntatori

1 int array[3] = {-1,-2,-3};


q
int *p;
2 p = array; // il nome dell’array ‘decade’ automaticamente
// in un puntatore ( = &(array[0]) )

3 int *q = array+2; // Ok
[0] [1] [2]
4 array++; // Errore
array

Programmazione C++ 33
Tipi di dati
Array (3)

◆Array e puntatori

1 int array[3] = {-1,-2,-3};


q
int *p;
2 p = array; // il nome dell’array ‘decade’ automaticamente
// in un puntatore ( = &(array[0]) )

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

1 int array[3] = {-1,-2,-3};


q
int *p;
2 p = array; // il nome dell’array ‘decade’ automaticamente
// in un puntatore ( = &(array[0]) )

3 int *q = array+2; // Ok
[0] [1] [2]
4 array++; // Errore
array
5 p++; // Ok

6 int v = array[1]; // == -2

7 int w = p[0]; // == *(p+0) == -2


p

Programmazione C++ 35
Tipi di dati
Array (4)

◆Array e puntatori

1 int array[2][3] = {{1,2,3},{4,5,6}};

[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]

array

◆ array di T <-> puntatore a T

◆ array di array di T <-> puntatore ad array di T

Programmazione C++ 36
Tipi di dati
Array (4)

◆Array e puntatori

1 int array[2][3] = {{1,2,3},{4,5,6}};

2 int *q = array; // Errore

[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]

array

◆ array di T <-> puntatore a T

◆ array di array di T <-> puntatore ad array di T

Programmazione C++ 37
Tipi di dati
Array (4)

◆Array e puntatori

1 int array[2][3] = {{1,2,3},{4,5,6}};

2 int *q = array; // Errore

3 int (*p)[3]; // Puntatore ad array di 3


// elementi di interi
[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]
4 p=array; // Ok

array

◆ array di T <-> puntatore a T p

◆ array di array di T <-> puntatore ad array di T

Programmazione C++ 38
Tipi di dati
Array (4)

◆Array e puntatori

1 int array[2][3] = {{1,2,3},{4,5,6}};

2 int *q = array; // Errore

3 int (*p)[3]; // Puntatore ad array di 3


// elementi di interi
[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]
4 p=array; // Ok

5 p++; array

6 (*p)[1]=10; // == array[1][1]=10;
p

◆ array di T <-> puntatore a T p

◆ array di array di T <-> puntatore ad array di T

Programmazione C++ 39
Tipi di dati
Array (5)

◆Array e puntatori

// Attenzione alle parentesi!

1 int (*p)[3]; // Puntatore ad array di 3 interi

2 int *r[3]; // Array di 3 puntatori a interi

[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]

r
p [0] [1]
[2]

◆Sfruttare sempre la regola di lettura dei puntatori a funzione


Programmazione C++ 40
Tipi di dati
Reference

◆E’ un alias (nome) di una locazione di memoria (variabile)

Tipo &nome_variabile=altra_variabile;

int Target, Altro;


char c;

1 int &Ref = Target; // Ok

2 Ref=118; // Target = 118


Target

3 int &r = Target, &q = Altro;

4 int &Ref; // Errore Ref

5 int &Ref = 90; // Errore

6 int &Ref = c; // Errore

◆Un reference DEVE essere inizializzato con una variabile


Programmazione C++ 41
Tipi di dati
Reference (2)

◆Visto anche come


⚫ “puntatore costante automaticamente dereferenziato”
⚫ “costante”=non riassegnabile

◆Si usano principalmente nel passaggio di parametri

Programmazione C++ 42
Tipi di dati
Puntatori e Reference

◆Esiste un puntatore a NULL (0)

◆Non esiste un riferimento a NULL

Programmazione C++ 43
Tipi di dati
Puntatori e Reference

◆Esiste un puntatore a NULL (0)

◆Non esiste un riferimento a NULL

◆Un puntatore può non essere inizializzato

◆Un reference DEVE essere inizializzato

Programmazione C++ 44
Tipi di dati
Puntatori e Reference

◆Esiste un puntatore a NULL (0)

◆Non esiste un riferimento a NULL

◆Un puntatore può non essere inizializzato

◆Un reference DEVE essere inizializzato

◆Un puntatore è riassegnabile

◆Un reference si riferisce ad uno e un solo dato

Programmazione C++ 45
Tipi di dati
Tipi Compositi : struct (1)
struct Punto
◆Raggruppa diversi tipi {
int x;
int y;
struct nome_tipo { }; // Ricordarsi ; !!

tipo1 nome1; // Esempi d’uso


Punto pt;
... Punto *ppt = &pt;
tipoN nomeN;
pt.x = 10; // Notare l’uso di .
};
ppt->y = 43; // Notare l’uso di ->

*ppt = pt;

◆Accesso ai dati membro con . o ->


⚫ Con . normalmente
⚫ Con -> se abbiamo un puntatore a struct

Programmazione C++ 46
Tipi di dati
Tipi Compositi : struct (2)

◆Raggruppa diversi tipi


⚫ La dimensione del dato complessivo dipende da tutti i dati membro (e non solo).

struct S1
{
char c1;
int i1;
char c2;
};

// Quanto è grande S1?

Programmazione C++ 47
Tipi di dati
Tipi Compositi : struct (2)

◆Raggruppa diversi tipi


⚫ La dimensione del dato complessivo dipende da tutti i dati membro (e non solo).

struct S1
{
char c1;
int i1;
char c2;
};

// Quanto è grande S1?

// sizeof(S1)=12

Programmazione C++ 48
Tipi di dati
Tipi Compositi : struct (2)

◆Raggruppa diversi tipi


⚫ La dimensione del dato complessivo dipende da tutti i dati membro (e non solo).

struct S1 struct S2
{ {
char c1; char c1;
int i1; char c2;
char c2; int i1;
}; };

// Quanto è grande S1? // Quanto è grande S2?

// sizeof(S1)=12

Programmazione C++ 49
Tipi di dati
Tipi Compositi : struct (2)

◆Raggruppa diversi tipi


⚫ La dimensione del dato complessivo dipende da tutti i dati membro (e non solo).

struct S1 struct S2
{ {
char c1; char c1;
int i1; char c2;
char c2; int i1;
}; };

// Quanto è grande S1? // Quanto è grande S2?

// 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

◆Elenco di valori (int) riferibili con un nome


enum nome {nome1=valore1, …, nomeN=valoreN};
1 enum giorno {lun=1, mar=3, mer=2, gio=7, ven=9, sab=90, dom=13};

2 giorno g;
g = 90; // Errore: Invalid conversion from int to giorni
g = sab; // Ok
int d = lun; // Ok

3 enum giorno {lun=10, mar, mer, gio, ven, sab, dom};


// mar=11, mer=12, gio=13, etc...

4 enum giorno {lun, mar, mer, gio, ven, sab, dom};


// lun=X, mar=X+1, mer=X+2, gio=X+3, ven=X+4, sab=X+5, dom=X+6

◆Praticamente delle costanti intere con tipo

Programmazione C++ 52
Tipi di dati
Nuovi nomi: typedef

◆La keyword typedef serve per definire nuovi nomi di tipi

typedef vecchio_tipo nuovo_nome;

typedef unsigned long int uli;


1
typedef uli *ptr_uli;

2 typedef double darray20[20];

uli i;
3 ptr_uli p = &i;

darray20 d1, d2;


4

Programmazione C++ 53
Tipi di dati
Modificatore “const” (1)

◆Il dato è costante

const tipo var = valore;

⚫ Immodificabilità
⚫ Necessaria inizializzazione
▪ E’ sempre possibile inizializzare una variabile const con una variabile (dello stesso tipo) non const

1 const int ci; // Errore

2 const int ci=10; // Ok

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)

◆Il dato è costante


⚫ Puntatori : dipende…

Programmazione C++ 55
Tipi di dati
Modificatore “const” (2)

◆Il dato è costante


⚫ Puntatori : dipende…
const int *p;

int *const p;

const int *const p;

Programmazione C++ 56
Tipi di dati
Modificatore “const” (2)

◆Il dato è costante


⚫ Puntatori : dipende…
const int *p; int i = 200;
const int *p = &i; // puntatore a intero costante

*p = 100; // Errore
p = 0; // Ok

int *const p;

const int *const p;

Programmazione C++ 57
Tipi di dati
Modificatore “const” (2)

◆Il dato è costante


⚫ Puntatori : dipende…
const int *p; int i = 200;
const int *p = &i; // puntatore a intero costante

*p = 100; // Errore
p = 0; // Ok

int *const p; int i = 200;


int * const p = &i; // costante e puntatore a intero

*p = 100; // Ok
p = 0; // Errore

const int *const p;

Programmazione C++ 58
Tipi di dati
Modificatore “const” (2)

◆Il dato è costante


⚫ Puntatori : dipende…
const int *p; int i = 200;
const int *p = &i; // puntatore a intero costante

*p = 100; // Errore
p = 0; // Ok

int *const p; int i = 200;


int * const p = &i; // costante e puntatore a intero

*p = 100; // Ok
p = 0; // Errore

const int *const p; int i = 200;


const int *const p = &i; // costante e puntatore a intero costante

*p = 100; // Errore
p = 0; // Errore

Programmazione C++ 59
Tipi di dati
Le stringhe (1)

◆Ci sono le stringhe C ...


⚫ Un array di caratteri terminato da ‘\0’
▪ Literal Strings (“Hello World”)
▪ Ha un solo operatore ([])
▪ Metodi specifici definiti in <cstring>
#include <iostream>
▪ Di solito gestite tramite puntatori a char
char strc[10]=“Buona”; // Inizializzazione dell’array con copia

char strl[]={‘G’,’i’,’o’,’r’,’n’,’a’,’t’,’a’,’\0’};

std::cout << strc << std::endl; // Stampa : Buona

std::cout << strl << std::endl; // Stampa : Giornata

char *strp=“Ciao”; // Attenzione! La stringa è costante!


// Meglio: const char *strp=“Ciao”;

std::cout << strp << std::endl; // Stampa : Ciao

Programmazione C++ 60
Tipi di dati
Le stringhe (2)

◆Ci sono le stringhe C ...


⚫ Un array di caratteri terminato da ‘\0’

char strc[10]=“Buona”; // Inizializzazione dell’array con copia

char strl[]={‘G’,’i’,’o’,’r’,’n’,’a’,’t’,’a’,’\0’};

char *strp=“Ciao”; // Attenzione! La stringa è costante!


// Meglio: const char *strp=“Ciao”;

B u o n a \0 % $ ? #
strc

strl G i o r n a t a \0

C i a o \0

strp Read-Only Memory

Programmazione C++ 61
Tipi di dati
Le stringhe (3)

◆... e le stringhe C++


⚫ Oggetti (classe string)
▪ Rappresentazione della stringa più complessa
▪ Hanno diversi operatori
▪ Conversione c-string<->c++-string
▪ Definite in <string>
#include <string>

std::string s1;

std::string s2=“pippo”;

s1=“pluto”;

s1[0]=‘B’;

std::cout << s1 << std::endl; // stampa : Bluto

std::cout << s1.c_str() << std::endl; // stampa : Bluto

Programmazione C++ 62
Definizioni e Dichiarazioni
Funzione Main ver. 2

◆Nuova versione: argomenti da riga di comando


#include <iostream>
using namespace std;

int main(int argc, char *argv[])


{
// argc : numero di argomenti passati al programma

// argv : array di puntatori a char (stringhe C) con gli argomenti


return 0;
}

...

Programmazione C++ 63
Definizioni e Dichiarazioni
Funzione Main ver. 2

◆Nuova versione: parametri da riga di comando


#include <iostream>
using namespace std;

int main(int argc, char *argv[])


{
// argc : numero di argomenti passati al programma

// argv : array di puntatori a char (stringhe C) con gli argomenti


return 0;
}

\0 argv[0]

\0 argv[1]

\0 argv[2]

argv ...

Programmazione C++ 64
Definizioni e Dichiarazioni
Funzione Main ver. 2

◆Nuova versione: parametri da riga di comando


#include <iostream>
using namespace std;

int main(int argc, char *argv[])


{
// argc : numero di argomenti passati al programma

// argv : array di puntatori a char (stringhe C) con gli argomenti

cout<<“Path eseguibile : “<<argv[0]<<endl;

for(int i=1;i<argc;i++)
cout<<“Parametro [“<<i<<“] : ”<<argv[i]<<endl;

return 0;
}

Test.exe pippo pluto paperino

Path eseguibile : d:\mingwstudio\examples\test\debug\test.exe


Parametro [1] : pippo
Parametro [2] : pluto
Parametro [3] : paperino

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

◆Usare sempre i cast espliciti C++


⚫ Non viola (se non esplicitamente richiesto) il type checking
⚫ E’ più facile trovarli nel codice

1 int i;
double d;

i=static_cast<int>(d); // cast esplicito C++ (1)

2 int *pi;
const int *cpi = &i;

pi=static_cast<int*>(cpi); // Errore, cast esplicito C++

pi=const_cast<int*>(cpi); // Ok, cast esplicito C++ (2)

3 char *c;

c=reinterpret_cast<char*>(&i); // cast esplicito C++ (3)

*(c+2)=0; // possibile cambiare i, byte a byte!

Programmazione C++ 67

Potrebbero piacerti anche