Linguaggio C++

Funzioni E Puntatori

Come passare puntatori come parametri a una funzione in C++ per modificare valori esterni.

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:

  • &x passa l indirizzo della variabile x alla funzione.
  • p è un puntatore che riceve quell indirizzo.
  • *p accede al valore di x e 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

VariabileIndirizzoContenuto
x0x61ff0c10 → 20
y0x61ff0820 → 10
aindirizzo interno0x61ff0c
bindirizzo interno0x61ff08

🔎 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.


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.