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.
Desafio
FácilEscreva um programa em C que implemente e demonstre a clássica função swap usando ponteiros. Seu programa deve:
- Criar uma função chamada
swapque recebe dois ponteiros para inteiros como parâmetros - Dentro da função
swap, trocar os valores nos endereços de memória apontados pelos dois ponteiros usando uma variável temporária - Na função
main, ler dois inteiros da entrada do usuário - Imprimir os valores originais no formato:
Before swap: a = [value], b = [value] - Chamar a função
swape passar os endereços de ambas as variáveis usando o operador address-of (&) - 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;
}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
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato