Um Exemplo Clássico: Swap
Parte da seção Lógica e Fluxo do Journey de C da Coddy. Lição 28 de 63.
A função de troca é um dos exemplos mais famosos que demonstram por que os ponteiros são essenciais na programação em 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.
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 desreferenciação, a função pode modificar diretamente os valores das variáveis originais. Isso torna a função de troca 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 executar.
Desafio
FácilEscreva um programa em C que implemente e demonstre a função clássica de troca usando ponteiros. Seu programa deve:
- Criar uma função chamada
swapque receba 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 de obtenção de endereço - 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 — a função precisa acessar os locais de memória das variáveis originais para trocar seus valores permanentemente, o que é impossível com a passagem por valor.
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 Lógica e Fluxo
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 ContatoPratique por conta própria: Compilador de C online