Menu
Coddy logo textTech

Um Exemplo Clássico: Swap

Parte da seção Logic & Flow do Journey de C da Coddy — lição 28 de 63.

A função swap é um dos exemplos mais famosos que demonstra por que os ponteiros são essenciais na programação C. O objetivo é simples: escrever uma função que troque os valores de duas variáveis. No entanto, essa tarefa aparentemente simples revela uma limitação fundamental da passagem por valor (pass-by-value).

Considere o que acontece se você tentar trocar duas variáveis usando a passagem por valor regular:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // Isso apenas troca as cópias, não as variáveis originais!
}

Esta abordagem falha porque a função recebe apenas cópias dos valores. As variáveis originais na função chamadora permanecem inalteradas.

A solução requer a passagem de ponteiros para as variáveis em vez disso:

void swap(int *a, int *b) {
    int temp = *a;  // Armazena o valor no endereço a
    *a = *b;        // Coloca o valor do endereço b no endereço a
    *b = temp;      // Coloca o valor armazenado no endereço b
}

Ao passar os endereços das variáveis e usar o operador de desreferência, a função pode modificar diretamente os valores das variáveis originais. Isso torna a função swap uma demonstração perfeita de quando e por que você precisa de ponteiros para realizar tarefas que a passagem por valor simplesmente não consegue lidar.

challenge icon

Desafio

Fácil

Escreva um programa em C que implemente e demonstre a clássica função swap usando ponteiros. Seu programa deve:

  1. Criar uma função chamada swap que recebe dois ponteiros para inteiros como parâmetros
  2. Dentro da função swap, trocar os valores nos endereços de memória apontados pelos dois ponteiros usando uma variável temporária
  3. Na função main, ler dois inteiros da entrada do usuário
  4. Imprimir os valores originais no formato: Before swap: a = [value], b = [value]
  5. Chamar a função swap e passar os endereços de ambas as variáveis usando o operador address-of (&)
  6. Após a chamada da função, imprimir os valores trocados no formato: After swap: a = [value], b = [value]

Sua saída deve demonstrar que a função troca com sucesso os valores das variáveis originais:

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

Este desafio demonstra por que os ponteiros são essenciais para a operação de troca (swap) - a função deve acessar os locais de memória das variáveis originais para trocar permanentemente seus valores, o que é impossível com a passagem por valor.

Folha de consulta

A função swap demonstra por que os ponteiros são essenciais em C. A passagem por valor não pode trocar as variáveis originais porque as funções recebem apenas cópias:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // Isso apenas troca as cópias, não as variáveis originais!
}

A abordagem correta utiliza ponteiros para acessar e modificar as variáveis originais:

void swap(int *a, int *b) {
    int temp = *a;  // Armazena o valor no endereço a
    *a = *b;        // Coloca o valor do endereço b no endereço a
    *b = temp;      // Coloca o valor armazenado no endereço b
}

Ao passar endereços e usar o operador de desreferência (*), a função pode modificar diretamente os valores das variáveis originais.

Experimente você mesmo

#include <stdio.h>

// TODO: Escreva sua função swap aqui

int main() {
    int a, b;
    
    // Ler entrada
    scanf("%d", &a);
    scanf("%d", &b);
    
    // Imprimir valores originais
    printf("Before swap: a = %d, b = %d\n", a, b);
    
    // TODO: Chame sua função swap aqui
    
    // Imprimir valores trocados
    printf("After swap: a = %d, b = %d\n", a, b);
    
    return 0;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Logic & Flow