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


Messaggi in questa discussione
Il C++ CH.05: i puntatori - da digger - 13/03/2011, 0:49
[Nessun oggetto] - da Pocciox - 27/08/2012, 8:43
[Nessun oggetto] - da Skyline@69 - 27/08/2012, 9:50
[Nessun oggetto] - da Pocciox - 27/08/2012, 10:26
[Nessun oggetto] - da Skyline@69 - 27/08/2012, 10:37
[Nessun oggetto] - da Pocciox - 27/08/2012, 12:34
[Nessun oggetto] - da Skyline@69 - 27/08/2012, 13:52
[Nessun oggetto] - da digger - 27/08/2012, 17:31
[Nessun oggetto] - da Pocciox - 27/08/2012, 20:10
[Nessun oggetto] - da Pocciox - 06/02/2013, 23:55

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



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