Comparando Ponteiros
Parte da seção Lógica e Fluxo do Journey de C da Coddy. Lição 10 de 63.
Você aprendeu a percorrer arrays usando aritmética de ponteiros. Agora vai descobrir que os ponteiros também podem ser comparados usando os mesmos operadores relacionais que você usa com variáveis comuns: ==, !=, < e >.
Quando você compara dois ponteiros, está comparando seus endereços de memória. Isso é particularmente útil quando ambos os ponteiros apontam para elementos dentro do mesmo array, pois permite determinar suas posições relativas na memória.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Aponta para o primeiro elemento
int *end = numbers + 4; // Aponta para o último elemento
if (start < end) {
printf("start comes before end in memory");
}A comparação de ponteiros se torna especialmente poderosa nas condições de loop. Em vez de usar uma variável de contador, você pode comparar a posição atual do ponteiro com um ponteiro-alvo para controlar quando o loop deve parar. Isso cria um código elegante e eficiente para percorrer arrays.
A principal descoberta é que ptr1 < ptr2 indica que ptr1 aponta para um elemento que aparece antes no array do que o elemento para o qual ptr2 aponta. Essa relação torna a comparação de ponteiros uma escolha natural para controlar loops que processam arrays sequencialmente.
Desafio
FácilEscreva um programa em C que use a comparação de ponteiros para percorrer um array e encontrar elementos dentro de um intervalo específico. Seu programa deve:
- Declarar um array de inteiros chamado
scorescom 8 elementos e inicializá-lo com os valores {45, 78, 92, 63, 87, 34, 91, 56} - Declarar dois ponteiros para inteiros:
start_ptreend_ptr - Fazer
start_ptrapontar para o primeiro elemento do array - Fazer
end_ptrapontar para o último elemento do array usando aritmética de ponteiros - Declarar um ponteiro chamado
current_ptre inicializá-lo para apontar para o primeiro elemento - Usar um loop while com comparação de ponteiros (
current_ptr <= end_ptr) para percorrer o array - Dentro do loop:
- Verificar se o valor atual está entre 60 e 90 (inclusive)
- Se o valor estiver no intervalo, imprimir exatamente
Value [value] is in range - Se o valor não estiver no intervalo, imprimir exatamente
Value [value] is out of range - Incrementar
current_ptrpara avançar para o próximo elemento
- Após o loop, usar a comparação de ponteiros para verificar se
current_ptragora está além do final do array, verificando securrent_ptr > end_ptr - Se a condição for verdadeira, imprimir exatamente
Traversal complete
Sua saída deve exibir os resultados no seguinte formato:
Value 45 is out of range
Value 78 is in range
Value 92 is out of range
Value 63 is in range
Value 87 is in range
Value 34 is out of range
Value 91 is out of range
Value 56 is out of range
Traversal completeEste desafio testa sua compreensão dos operadores de comparação de ponteiros em condições de loop, do uso de aritmética de ponteiros para definir ponteiros de limite e de como a comparação de ponteiros pode controlar a travessia de arrays de forma mais elegante do que loops tradicionais baseados em contadores.
Experimente você mesmo
#include <stdio.h>
int main() {
// TODO: Escreva seu código abaixo
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