Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[Guida] Il C++ CH.05: i puntatori

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
by Alessandrone

Bene bene, ecco che scrivo anche io qualcosa sul C++.
Questa mia prima lezione vuole fare da continuazione a quelle precedenti di digger, comunque se qualcosa non è chiaro non esitate
a chiedere ;D
I puntatori sono molto importanti e un vero programmatore deve saperne fare il corretto uso.
Si tratta generalmente di variabili (possono essere anche costanti) in cui possiamo mettere solo degli indirizzi
di memoria. Un indirizzo di memoria è un semplice numero (quasi sempre interpretato con codifica esadecimale) relativo
ad una specifica cella di memoria di un programma. Anche i puntatori sono caratterizzati dai tipi (di cui digger ha già parlato),
ad esempio se vorremo puntare ad un oggetto int, tale dovrà essere il puntatore.
Ecco come definirne uno:
int* puntatore;
Come vedete ho semplicemente aggiunto * al tipo di puntatore che mi serviva.
int variabile = 112032;
int* puntatore = &variabile;

L'operatore & si utilizza in questo caso per ottenere l'indirizzo di memoria dove è salvata una variabile.
Possiamo agire direttamente su variabile per mezzo di puntatore usando l'operatore di dereferenziazione,
nuovamente *, ma questa volta anteposto:

int variabile = 112032;
int* puntatore = &variabile;
*puntatore = 32;
Ora puntatore non è cambiato, al contrario punta sempre a variabile. E' cambiato invece il valore dell'oggetto a cui punta (variabile), che è diventato 32.
I puntatori ci permettono di agire sugli oggetti senza dover memorizzare delle copie di essi. Ecco un semplice esempio:

double Somma( double a, double b) { return(a+b); }

Questa funzione crea due variabili locali di tipo double (quindi pesanti 8 byte ciascuna) in cui copia il valore che gli passiamo richiamandola.
Chiaramente queste variabili vengono distrutte ( o lo spazio utilizzato per allocarle reso disponibile per nuove allocazioni) al termine della esecuzione
della funzione, quindi non è tanto un problema di spazio (oddio, certe volte potrebbe anche esserlo,
come quando usiamo classi molto complesse), quanto un problema di velocità.
I puntatori non sono mai troppo pesanti, sono pertanto più veloci da passare alle funzioni.

double Somma( double* a, double* b) { return(*a+*b); }
potrebbe essere una soluzione preferibile alla precedente.
Possiamo avvertire i vantaggi di questo metodo quando utilizziamo tipi di dati moooolto più pesanti di un semplice double.

Un altro vantaggio dei puntatori è la possibilità di fornire una variabile ad una funzione da riempire.
Piccolo esempio:
void RiempiStringa(char* str) { /*codice che riempie la variabile passata*/ }
char* str[23]; //definisco una variabile puntatore a stringa lunga 22 caratteri;
RiempiStringa(str);
//Ora ho in str quello che RiempiStringa ci ha messo. Tramite il puntatore RiempiStringa ha potuto riferirsi alla variabile str.

Proviamo ora a fare una funzione che prenda due stringhe (c-style array di caratteri null-terminati) e le unisca in una, ritornando questa ultima.


Codice:
char* UnisciStringhe( char* str1, char* str2) //str1 e str2 puntatori a caratteri.
/* c'è da fare un piccolo inciso, str1 e str2 sono sì puntatori a carattere, ma li utilizzeremo come puntatori ad array di caratteri.
Per rispettare la loro definizione tuttavia dovranno puntare ad un solo carattere, puntano dunque al primo dell'array. Potremo leggere
i seguenti aumentando di 1 l'indirizzo del puntatore */
{
int len = strlen(str1)+strlen(str2)+1;
char* return_string = new char[len];
for(int i=0;i<strlen(str1);i++) {return_string[i] = str1[i];}
for(int i=0;i<strlen(str2);i++) {return_string[i+strlen(str1)] = str2[i];}
*(return_string+len-1) = NULL; //null termino
return return_string;
}




digger
13/03/2011, 0:49
#1
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Mix: 0
*alza la mano* *si immagina che un prof gli dica di parlare*


Io non ho capito bene a cosa serve sto puntatore e sopratutto come si pronunzia &

27/08/2012, 8:43
#2
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
i puntatori sono il capitolo più difficile della programmazione in c...
col tempo si comincia a capirci qualcosa, e personalmente dopo anni che sono al c, spesso e volentieri ho dei problemi coi puntatori Happywide

27/08/2012, 9:50
#3
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Mix: 0
e sopratutto come si pronunzia &

E comunque ho capito che sono difficili ma a cosa servono?

27/08/2012, 10:26
#4
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
(27/08/2012, 10:26)Pocciox Ha scritto:

[Per vedere i link devi REGISTRARTI.]

e sopratutto come si pronunzia &

E comunque ho capito che sono difficili ma a cosa servono?

E la difficoltà sta proprio nel capire a che servono e quando è utile utilizzarli Happywide

Perchè lo devi pronunciare sto &???

Cmq per farla breve, quando hai una variabile in un programma che deve essere modificata da più funzioni, e vuoi che tutte le funzioni appunto facciano riferimento alla stessa variabile, allora si usano i puntatori!

Insomma tu hai una variabile mamma, e vuoi che tutti accedano a tua mamma (alla variabile però Happywide ) allora che fai?
Lasci la variabile li dov'è e ne crei un'altra universale (un puntatore) che in effetti non contiene un valore numerico ma solo l'indirizzo di memoria dove si trova tua mamma (sempre la variabile)..
così tutte le funzioni sanno dove si trova tua mamma e tutte hanno a che fare SOLO con lei Smile

Sono stato esauriente??

27/08/2012, 10:37
#5
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Mix: 0
Alla fine sono come i playerPOINTER e serverpointer!che ogni hack che si riferisce al Pg è riferito al player...giusto??ho capito bene?

27/08/2012, 12:34
#6
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
(27/08/2012, 12:34)Pocciox Ha scritto:

[Per vedere i link devi REGISTRARTI.]

Alla fine sono come i playerPOINTER e serverpointer!che ogni hack che si riferisce al Pg è riferito al player...giusto??ho capito bene?

Più o meno si Smile

27/08/2012, 13:52
#7
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
quello che ha detto Sky è corretto circa il fatto di accedere alla stessa variabile, ma in realtà il puntatore è qualcosa di piu generico, non è nato per quello scopo anche se poi quello è uno dei possibili utilizzi.
Il puntatore altro non è che una variabile di memoria che per contenuto ha un valore che rappresenta un indirizzo di memoria.
Cosa quella memoria rappresenti non ci interessa, quello che ci interessa che che il nostro puntatore ci dice "dove si trova".
Giustamente il playerpointer e il serverpointer sono due possibili esempi. Il playerpointer quindi è una varibile che contiene un indirizzo, quello della struttura che contiene tutti i dati del player.
QUindi se noi vogliamo accedere ai dati del player come facciamo se non sappiamo dove stanno sti dati? lo sappiamo con il puntatore al player.


digger
27/08/2012, 17:31
#8
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Mix: 0
Beh bastava farmi l esempio del playerpointer e avevo capito tutto Smile))

27/08/2012, 20:10
#9
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Mix: 0
Ragazzi, ho capito cos'è un puntatore Happywide
Era meglio se digger scriveva "ciò che è puntato da *puntatore " . si capiva meglio.

06/02/2013, 23:55
#10
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  [Guida] C/C++ Conversione INT->FLOAT (puntatori) digger 18 3,419 26/07/2011, 13:57
Ultimo messaggio: Skyline@69



Utenti che stanno guardando questa discussione: 1 Ospite(i)