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.
Sfida
FacileScrivi un programma C che implementi e dimostri la classica funzione swap usando i puntatori. Il tuo programma dovrebbe:
- Creare una funzione denominata
swapche accetti come parametri due puntatori a interi - All'interno della funzione
swap, scambiare i valori agli indirizzi di memoria indicati dai due puntatori usando una variabile temporanea - Nella funzione
main, leggere due interi dall'input dell'utente - Stampare i valori originali nel formato:
Before swap: a = [value], b = [value] - Chiamare la funzione
swape passare gli indirizzi di entrambe le variabili usando l'operatore di indirizzo - 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;
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Fondamenti dei puntatori
Che cos’è un puntatore?Dichiarare i puntatoriL’operatore di indirizzo (&)L’operatore di dereferenziazione (*)Puntatori NULLRiepilogo: nozioni di base sui puntatori4Progetto: Utility di testo semplice
Panoramica del progettoConteggio dei caratteri2Puntatori e array
I nomi degli array come puntatoriElementi degli array e puntatoriAritmetica dei puntatoriConfrontare i puntatoriRiepilogo: attraversamento di un array con i puntatori5Puntatori e funzioni
Passaggio per valorePassare puntatori alle funzioniModificare le variabili tramite puntatoriUn esempio classico: scambiare valoriPassare array alle funzioniRiepilogo: argomenti puntatore nelle funzioni3Array di caratteri e stringhe
Stringhe come array di charIl terminatore nullInput di stringhe con scanfUso di strlen()Uso di strcpy()Uso di strcat()Uso di strcmp()Riepilogo: funzioni di base per le stringhe6Gestione della memoria
Memoria Stack vs. HeapAllocazione dinamica - malloc()Usare sizeof() per l'allocazioneVerificare il fallimento dell'allocazioneLiberare la memoria con free()Allocare con calloc()Riepilogo: array dinamico9Progetto: Inserimento semplice di un contatto
Progetto: Definire una struct ContattoFunzione per creare un contattoEsercitati da solo: Compilatore C online