In C++, quando una funzione riceve una variabile come parametro, per impostazione predefinita lavora su una copia. Questo significa che qualsiasi modifica fatta all interno della funzione non influisce sulla variabile originale. Usando invece i puntatori, possiamo passare l indirizzo di memoria della variabile e modificarla direttamente.
1️⃣ Passaggio per valore
Vediamo il comportamento predefinito del C++ quando passiamo una variabile “per valore”.
void incrementa(int n) {
n = n + 1;
}
int main() {
int x = 5;
incrementa(x);
cout << "x = " << x;
}
✅ Output:
x = 5
❌ Il valore non cambia, perché la funzione lavora su una copia di x.
2️⃣ Passaggio per indirizzo (puntatore)
Se invece passiamo l indirizzo della variabile, la funzione può modificarla direttamente:
void incrementa(int* p) {
*p = *p + 1;
}
int main() {
int x = 5;
incrementa(&x);
cout << "x = " << x;
}
✅ Output:
x = 6
👉 In questo caso:
&xpassa l indirizzo della variabilexalla funzione.pè un puntatore che riceve quell indirizzo.*paccede al valore dixe lo modifica.
3️⃣ Passaggio di più puntatori
Le funzioni possono ricevere anche più puntatori contemporaneamente. Ecco un esempio per scambiare due numeri:
void scambia(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 10, y = 20;
scambia(&x, &y);
cout << "x = " << x << " y = " << y;
}
✅ Output:
x = 20 y = 10
💡 Passando i puntatori, la funzione modifica direttamente i valori reali e non le loro copie.
4️⃣ Schema della memoria
| Variabile | Indirizzo | Contenuto |
|---|---|---|
| x | 0x61ff0c | 10 → 20 |
| y | 0x61ff08 | 20 → 10 |
| a | indirizzo interno | 0x61ff0c |
| b | indirizzo interno | 0x61ff08 |
🔎 Gli indirizzi passati vengono copiati nella funzione, ma i dati modificati sono quelli reali nel main.
5️⃣ Passaggio di un array a una funzione
Quando si passa un array, in realtà si passa già un puntatore al primo elemento:
void stampaArray(int* v, int n) {
for (int i = 0; i < n; i++)
cout << *(v + i) << " ";
}
int main() {
int numeri[4] = {1, 2, 3, 4};
stampaArray(numeri, 4);
}
✅ Output:
1 2 3 4
👉 Non serve usare & perché il nome dell array (numeri) è già un puntatore.
6️⃣ Programma completo: doppiare i valori
Scriviamo un programma che raddoppia tutti i valori di un array, usando una funzione che riceve un puntatore:
#include <iostream>
using namespace std;
void raddoppia(int* v, int n) {
for (int i = 0; i < n; i++)
*(v + i) = *(v + i) * 2;
}
int main() {
int numeri[5] = {1, 3, 5, 7, 9};
raddoppia(numeri, 5);
cout << "Vettore raddoppiato: ";
for (int i = 0; i < 5; i++)
cout << numeri[i] << " ";
}
✅ Output:
Vettore raddoppiato: 2 6 10 14 18
LABORATORIO
Passaggio di Puntatori a una Funzione
In questo laboratorio imparerai a passare puntatori a una funzione per modificare i valori delle variabili o lavorare con array interi.
- Ambiente di sviluppo C++ (Code::Blocks, Dev-C++ o Visual Studio Code)
- Console per osservare i risultati
1 Incrementare una variabile tramite puntatore
Scrivi una funzione void incrementa(int* p) che aumenta di 1 il valore puntato.
void incrementa(int* p) {
*p = *p + 1;
}
2 Modificare più variabili
Scrivi una funzione void sommaProdotto(int* a, int* b, int* somma, int* prod) che calcola la somma e il prodotto di due numeri passati per indirizzo.
void sommaProdotto(int* a, int* b, int* somma, int* prod) {
*somma = *a + *b;
*prod = (*a) * (*b);
}
3 Passaggio di un array
Scrivi una funzione che riceve un array e stampa gli elementi con *(v+i).
void stampaArray(int* v, int n) {
for (int i = 0; i < n; i++)
cout << *(v + i) << " ";
}
4 Esercizi aggiuntivi
- Scrivi una funzione che inverte il contenuto di due variabili (swap).
- Scrivi una funzione che raddoppia tutti i valori di un vettore.
- Scrivi una funzione che trova il valore massimo in un array e lo restituisce tramite un puntatore.