Menu
Coddy logo textTech

Puntatori e riferimenti

Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 13 di 104.

Ora che hai capito la memoria stack e heap, esploriamo gli strumenti che ti permettono di lavorare direttamente con le posizioni di memoria: puntatori e riferimenti.

Un puntatore memorizza l'indirizzo di memoria di un'altra variabile. Lo dichiari con * e ottieni un indirizzo usando &.

int value = 42;
int* ptr = &value;    // ptr contiene l'indirizzo di value

std::cout << ptr;     // Stampa l'indirizzo di memoria
std::cout << *ptr;    // Dereferenziazione: stampa 42

Un riferimento è un alias per una variabile esistente. Una volta associato, si riferisce sempre a quella variabile. Lo dichiari con &.

int value = 42;
int& ref = value;     // ref è un alias di value

ref = 100;            // Modifica value portandolo a 100
std::cout << value;   // Stampa 100

Differenze principali:

PuntatoriRiferimenti
Possono essere nullDevono essere inizializzati
Possono essere riassegnatiNon possono essere ricollegati
Usa * per accedere al valoreAccedi direttamente al valore
Possono puntare a nullaSono sempre validi

Entrambi sono essenziali per passare oggetti alle funzioni in modo efficiente senza copiarli e per lavorare con la memoria allocata nell'heap. I riferimenti sono più sicuri e semplici, mentre i puntatori offrono maggiore flessibilità quando devi riassegnarli o verificare che siano null.

challenge icon

Sfida

Facile

Costruiamo un semplice sistema di manipolazione dei valori che mostra come puntatori e riferimenti funzionano in modo diverso quando si modificano i dati.

Creerai due file per organizzare il tuo codice:

  • ValueOps.h: definisci tre funzioni che modificano i valori interi in modi diversi:
    • doubleByPointer(int* ptr): accetta un puntatore e raddoppia il valore a cui punta
    • tripleByReference(int& ref): accetta un riferimento e triplica il valore
    • swapValues(int* a, int* b): accetta due puntatori e scambia i valori a cui puntano
  • main.cpp: leggi due interi dall'input, poi mostra sia i puntatori sia i riferimenti:
    • Stampa i valori originali: "Original: <first> <second>"
    • Usa doubleByPointer sul primo valore, poi stampa: "After double: <first>"
    • Usa tripleByReference sul secondo valore, poi stampa: "After triple: <second>"
    • Usa swapValues per scambiare entrambi i valori, poi stampa: "After swap: <first> <second>"

Quando chiami funzioni con i puntatori, ricordati di usare l'operatore indirizzo (&) per passare l'indirizzo della variabile. I riferimenti funzionano in modo più naturale: passa direttamente la variabile.

Includi il tuo file header in main.cpp usando #include "ValueOps.h".

Provalo tu

#include <iostream>
#include "ValueOps.h"
using namespace std;

int main() {
    // Lee dos números enteros de la entrada
    int first, second;
    cin >> first;
    cin >> second;
    
    // Imprime los valores originales
    cout << "Original: " << first << " " << second << endl;
    
    // TODO: Usa doubleByPointer con el primer valor (pasa su dirección usando &)
    
    // TODO: Imprime después de duplicar
    
    // TODO: Usa tripleByReference con el segundo valor (pasa la variable directamente)
    
    // TODO: Imprime después de triplicar
    
    // TODO: Usa swapValues para intercambiar ambos valores (pasa sus direcciones usando &)
    
    // TODO: Imprime después del intercambio
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C++ online