Comparando Ponteiros
Parte da seção Logic & Flow do Journey de C da Coddy — lição 10 de 63.
Você aprendeu como percorrer arrays usando aritmética de ponteiros. Agora você descobrirá que ponteiros também podem ser comparados usando os mesmos operadores relacionais que você usa com variáveis comuns: ==, !=, < e >.
Quando você compara dois ponteiros, você 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 torna-se especialmente poderosa em condições de loop. Em vez de usar uma variável de contador, você pode comparar a posição atual do seu ponteiro com um ponteiro de destino para controlar quando o loop deve parar. Isso cria um código elegante e eficiente para a travessia de arrays.
A principal percepção é que ptr1 < ptr2 informa 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 um ajuste natural para controlar loops que processam arrays sequencialmente.
Desafio
FácilEscreva um programa em C que utilize 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 - Configurar
start_ptrpara apontar para o primeiro elemento do array - Configurar
end_ptrpara apontar 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 "Value %d is in range"
- Se o valor não estiver no intervalo, imprimir "Value %d is out of range"
- Incrementar
current_ptrpara mover para o próximo elemento
- Após o loop, usar a comparação de ponteiros para verificar se
current_ptrestá agora além do final do array, verificando securrent_ptr > end_ptr - Se a condição for verdadeira, imprimir "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, o uso de aritmética de ponteiros para definir ponteiros de limite e como a comparação de ponteiros pode controlar a travessia de um array de forma mais elegante do que os loops tradicionais baseados em contadores.
Folha de consulta
Ponteiros podem ser comparados usando operadores relacionais: ==, !=, <, e >.
Ao comparar ponteiros, você está comparando seus endereços de memória. Isso é útil para determinar as posições relativas de elementos dentro do mesmo array.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Points to first element
int *end = numbers + 4; // Points to last element
if (start < end) {
printf("start comes before end in memory");
}A comparação de ponteiros é particularmente poderosa em condições de loop, permitindo que você controle loops comparando posições de ponteiros em vez de usar variáveis de contador:
int *current_ptr = numbers;
int *end_ptr = numbers + 4;
while (current_ptr <= end_ptr) {
// Process current element
current_ptr++; // Move to next element
}A expressão ptr1 < ptr2 significa que ptr1 aponta para um elemento que aparece antes no array do que o elemento para o qual ptr2 aponta.
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 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