Menu
Coddy logo textTech

Un esempio classico: scambiare valori

Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 28 di 63.

La funzione di scambio è uno degli esempi più famosi che dimostrano perché i puntatori sono essenziali nella programmazione in C. L'obiettivo è semplice: scrivere una funzione che scambi i valori di due variabili. Tuttavia, questo compito apparentemente semplice rivela una limitazione fondamentale del passaggio per valore.

Considera cosa succede se provi a scambiare due variabili usando il normale passaggio per valore:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // Questo scambia solo le copie, non le variabili originali!
}

Questo approccio non funziona perché la funzione riceve solo copie dei valori. Le variabili originali nella funzione chiamante rimangono invariate.

La soluzione richiede invece di passare i puntatori alle variabili:

void swap(int *a, int *b) {
    int temp = *a;  // Memorizza il valore all'indirizzo a
    *a = *b;        // Inserisci il valore dell'indirizzo b nell'indirizzo a
    *b = temp;      // Inserisci il valore memorizzato nell'indirizzo b
}

Passando gli indirizzi delle variabili e usando l'operatore di dereferenziazione, la funzione può modificare direttamente i valori delle variabili originali. Questo rende la funzione di scambio una dimostrazione perfetta di quando e perché servono i puntatori per svolgere operazioni che il passaggio per valore semplicemente non può gestire.

challenge icon

Sfida

Facile

Scrivi un programma C che implementi e dimostri la classica funzione swap usando i puntatori. Il tuo programma dovrebbe:

  1. Creare una funzione denominata swap che accetti come parametri due puntatori a interi
  2. All'interno della funzione swap, scambiare i valori agli indirizzi di memoria indicati dai due puntatori usando una variabile temporanea
  3. Nella funzione main, leggere due interi dall'input dell'utente
  4. Stampare i valori originali nel formato: Before swap: a = [value], b = [value]
  5. Chiamare la funzione swap e passare gli indirizzi di entrambe le variabili usando l'operatore di indirizzo
  6. Dopo la chiamata alla funzione, stampare i valori scambiati nel formato: After swap: a = [value], b = [value]

L'output dovrebbe dimostrare che la funzione scambia correttamente i valori delle variabili originali:

Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]

Questa sfida dimostra perché i puntatori sono essenziali per l'operazione di scambio: la funzione deve accedere alle posizioni di memoria delle variabili originali per scambiarne i valori in modo permanente, cosa impossibile con il passaggio per valore.

Provalo tu

#include <stdio.h>

// TODO: Escribe tu función swap aquí

int main() {
    int a, b;
    
    // Lee la entrada
    scanf("%d", &a);
    scanf("%d", &b);
    
    // Imprime los valores originales
    printf("Before swap: a = %d, b = %d\n", a, b);
    
    // TODO: Llama a tu función swap aquí
    
    // Imprime los valores intercambiados
    printf("After swap: a = %d, b = %d\n", a, b);
    
    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 Logica e flusso

Esercitati da solo: Compilatore C online